vfork 와 exit 질문입니다.
스티븐책에보니깐,
vfork를 하면 자식프로세스가 exec함수를 호출하기전까지
부모프로세스 메모리 공간을 공유한다고 했는데요.
자식프로세스에서 종료시 exit를 해버리면
부모프로세스와 공유하고 있는 파일지시자도 함께 닫아버리기 때문에
부모프로세스에서 printf등을 하면 -1을 리턴할것이라고 합니다만.
실제로 해보니깐,
vfork에 의한 자식프로세스에서 exit(0)를 하더라도
부모프로세스에서는 fprintf / printf를 여전히 가능하네요.
아래는 소스입니다.
#include
#include
#include
int gintAbc = 6;
char buf[] = "a write to stdout\n" ;
FILE *fw;
int main()
{
int intVar;
pid_t pid;
intVar = 88;
if ( !(fw = fopen( "file" , "w" )) )
{
fprintf( stderr , "fopen fail\n" );
exit( 1 );
}
fprintf( fw , "This is Start\n" );
if ( write( 1 , buf , sizeof buf - 1 ) != sizeof buf - 1 )
{
perror("");
exit( 2 );
}
printf( "before vfork\n" );
if ((pid = vfork()) == -1 ) /* Parent blocks until child
call exec func */
{
perror("");
exit( 2 );
}
else if ( pid == 0 )
{
gintAbc++;
intVar++;
//_exit( 0 );
exit( 0 );
}
printf( "Pid %d intVar %d gintAbc %d\n"
, getpid() , intVar , gintAbc );
fprintf( fw , "Now finished\n" );
fclose( fw );
return 0;
}
솔라리스환경인데..왜그런지요?
Re: vfork 와 exit 질문입니다.
메모리를 공유한다고 해서..
파일 디스크립터 테이블까지 공유한다는 말은 아닐텐데요..
혹시 공유를 한다고 해도..
파일 여는 기술자에 카운터 같은것이 존재 하여
모두 닫혔을 경우에..
닫힐것 같습니다..
Re: vfork 와 exit 질문입니다.
호.. 정말 솔라리스에서는 안되군요....
HP에서는 exit를 사용하면 parent의 stdin/out/err이 child가 종료될 때
종료되고 _exit를 사용하면 child가 종료되어도 살아있더군요.
HP랑 솔라리스랑 man은 거의 비슷하고 특이한 점이 없던데.....
으.. 궁금타.
Re^2: 도움은 별로 안될 거 같지만...
solaris에서 truss로 위의 소스를 확인 해보니...
exit()를 call했음에도 _exit()를 call하더군요.
hp에서는 exit()를 call하니 exit()를 call하구요...
truss가 뭐하는 툴인가요?
설명좀 부탁드립니다...
Re^4: truss가 뭐하는 툴인가요?
truss는 system call이나 signal, machine 오류등을 trace하는 utility입
니다.
작성한 소스가 어떤 system call을 수행하는지 확인할 때 혹은 signal관련
문제를 확인할 때라던지...위의 문제처럼 OS dependent한 문제를 확인할
때라던지.... 혹은 심심할 때라던지... 그렇때 주로 사용되더군요. ^^
solaris는 truss hp는 tusc linux는 strace입니다.
보다 자세한 정보는 man truss
댓글 달기