fork 관련 질문입니다. 아래소스를 봐주십시오.
#include
#include
#include
#include
#include
#include
void mysig(int signo);
int main( int argc , char *argv[] )
{
pid_t pid, cpid;
static struct sigaction act;
fprintf( stderr , "Parent %d....start!\n" , getpid() );
act.sa_handler = mysig;
sigaction(SIGALRM , &act , 0);
sigaction(SIGINT , &act , 0);
sigaction(SIGCHLD , &act , 0);
sigaction(SIGCLD , &act , 0);
sigaction(SIGTSTP , &act , 0);
alarm ( 1 );
pid = fork();
if ( pid == 0 ) /* Child */
{
fprintf( stderr , "Child %d....start!\n" , getpid() );
sleep( 10 );
}
else if ( pid > 0 ) /* Parent */
{
cpid = wait(0);
fprintf( stderr , "I'm Parent %d....My Child[%d] is dead
Now.\n" , getpid(), cpid );
}
else
{
perror("fork fail");
}
return 0;
}
void mysig(int signo)
{
fprintf( stderr , "PID[%d] received signal %
d\n" , getpid() , signo );
}
와 같이 했는데 실행하면
Parent 20681....start!
Child 20682....start!
PID[20681] received signal 14
I'm Parent 20681....My Child[-1] is dead Now.
와 같이 나오고 죽습니다. 거의 바로 죽는데....
자식프로세스에서 10초가 sleep하도록 했는데
I'm Parent 20681....My Child[-1] is dead Now.
이메시지가 거의 바로 떨어지는 이유는 뭔지요?
제생각에는 자식이 10초간 있다간 잠에서 깨어나면
기다리고 있던 부모가(wait(0)) 그때 죽는것으로 예상했거든요...
alarm 때문에 죽는게 아닐까요? [냉무]
무
Re^2: alarm 때문에 죽는게 아닐까요? [냉무]
alarm 시그널이 시그널핸들러(mysig)에서 잡혀서 처리돼고 있는데요
alarm시그널이 프로세스를 죽이나요
Re: fork 관련 질문입니다. 아래소스를 봐주십시오.
wait() 함수의 리턴값이 -1 이면 정상적으로 수행되지 않았다는 소리거덩
여...
errno 를 찍어보니까 EINTR이 나네여...
출력메시지 중에 보면 signal 14번 있자나여.. SIGALRM인가여?
그거 발생하면서 wait() 함수가 EINTR을 내면서 실패한거져...
음... wait()나 read() 뭐 이런 종류의 시스템콜을 아마 slow(?) system
call인가 비슷한 용어로 부를꺼예여... 즉 시스템콜 수행시 임의의 긴 시
간이 걸리는거져.... 이랬을 때 signal이 발생하는 것과 같은 외부상황이
발생하면 EINTR을 내면서 현재 연산을 실패내거덩여...
아마 넷웍 프로그램쪽을 해 보셨으면 accept() 를 호출했을 때 실패하면
errno 값을 비교해봐서 EINTR이면 다시 accept()를 불러주셨던 기억이 있
으실겁니다.
slow 시스템콜 수행시 다른 이벤트가 발생했어도 수행을 계속하도록 기본
동작을 바꿀 수가 있거덩여... 관련 서적을 참고해 보시구여.. (아마 스티
븐스 책에 나와있을꺼 같은데여...)
님 같은 경우에는 wait() 부르신 후에 리턴값 검사해서 -1 이면
errno 검사해서 EINTR이면 다시 wait() 부르심 될겁니다.
현재에는 alarm(1) 에서 설정해 놓은 알람이 expire되면서 14번 시그널이
발생했고, 이것때문에 wait()가 EINTR을 내면서 실패를 낸 것입니다.
수고여,,
명쾌한 답변 !!! 감사합니다.
man waitpid해보니깐
wait는 다음 3가지 경우에 대해 수행을 중단하는군요.
1.자식이 죽을 때까지 중단.
2.프로세스를 terminate시키는 시그널을 받을때까지 중단.
3.발생한 시그널이 (구현된)시그널핸들러에 의해 잡힐때까지 중단.
Re: fork 관련 질문입니다. 아래소스를 봐주십시오.
흠... SIGCHLD 가 발생한 것은 자식 프로세스가 죽었을때 발생하는
시그널입니다.
본래 wait(0) 이것을 이 SIGCHILD에 두거나
아니면 그 Signal을 가로챌 필요는 없습니다.
ALRM또한 중대한 시점 요소가 작용되네요.
차라리 wait(0)를 사용치 마시고
자식 프로세스의 첫부분에 setsid() 를 한번 호출하세요.
그럼 해결됩니다. 본래 그게 더욱 명확한 작동이 될것입니다.
댓글 달기