2010-07-12 6 views
4

포크의 신호 동작은 무엇입니까? 모든 신호가 포크에서 상속되어야합니까?포크의 신호

답변

13

적어도 Linux에서는 시그널 핸들러 자체가 계승되지만 보류 신호는 상속되지 않습니다. 리눅스 fork(2)man page 인용

:

포크()는 자사의 PID와 PPID에 부모 프로세스와 다른 자식 프로세스를 생성하고, 자원 사용률은 0 파일 잠금으로 설정되어 있다는 사실에 보류중인 신호는 상속되지 않습니다.

이것은 신호가 (부모) 프로세스에 속하기 때문에 의미가 있습니다. 새로 생성 된 프로세스는 (현재) 현재 프로세스의 복사본이므로 시그널 핸들러는 보존됩니다. 직접 관련되지 않지만

종종 새로운 실행 파일 (현재 신호를 서비스하는 기능을 덮어) 프로세스에로드되고 이후는 fork() 모든 신호 처리기를 파괴 따르는 exec() 형 호.

+0

'exec()'형식 호출은 'SIG_IGN'으로 설정된 항목을 재설정하지 않습니다. 적어도 Linux에서는 이러한 설정이 하위 행을 캐스케이드합니다. 이것은''SIGCHLD'를'SIG_IGN'으로 설정 한 다음 쉘을 생성합니다 :-) 나는 당신도 * * [여기] (http://stackoverflow.com/questions/32708086/)에 응답하는 것을 본다. ignoring-signals-in-parent-process), 그러니 신경 쓰지 마세요 ;-) – Steven

0

그러나 코드가 이식성이 있으며 모든 플랫폼에서 일관성을 유지하면 프로그램 실행에 영향을 줄 수있는 신호의 동작을 검사하는 것이 더 좋습니다. Linux가 보장하기는하지만 구현 방법은 자유롭게 선택할 수 있습니다 구현. sigaction 같은 것을 편리하게 사용할 수 있습니다.

0

신호 처리기가 복사 되더라도 보류중인 신호가 다시 초기화된다는 paxdiablo 대답으로갑니다. 여기 do_fork의 커널 소스 코드에서 잘라내어 실제로 프로세스 대신 포킹을 수행합니다.

/*do_fork(...)*/ 
spin_lock_init(&p->alloc_lock); 

init_sigpending(&p->pending);// reinitializing the pending signals