2011-08-23 4 views
1

fork를 사용하여 하위 프로세스를 생성 한 Linux 서비스 프로세스가 있고 execelp를 실행하여 다른 프로그램을 실행합니다. "kill -6 [child_pid]"명령을 실행하면 효과가 없습니다. 자식 프로그램이 단독으로 실행되는 경우에도 동일한 명령으로 자식 프로그램이 종료되므로이 경우 시스템에서 신호가 처리되고 있음을 확신 할 수 있습니다. 그런데 왜 그것이 te 서비스 프로세스의 통제하에있을 때 자식 프로세스에 의해 수신되지 않는 것입니까? 어떤 도움이라도 대단히 감사하겠습니다.자식 프로세스에서 signal SIGABRT가 무시되는 이유

그리고 이것은 RedHat Linux와 CentOS에서 발생합니다.

코어 파일 크기는 무제한으로 설정됩니다.

나는 부모 프로세스가 SIGABRT를 처리 (무시)하지 않는다는 것을 알기 때문에 동일한 프로세스가 부모 프로세스에서 작동한다는 것을 말씀 드리고 싶습니다. 부모는 쉘 스크립트 (bash)에 의해 실행됩니다. 따라서 "ps"명령을 실행하면 쉘 스크립트 pid, 부모 pid 및 자식 pid가 표시됩니다. 이 명령은 상위 pid 및 쉘 스크립트 pid에서 작동합니다.

execlp 자식 프로그램 후 자식 프로세스가 신호 처리기를 상속하는 경우에도 내 이해가 있습니다.

+0

이해가 잘못되었습니다 ... 함수의 [exec family] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html)로 인해 자식이 무시되고 차단 된 신호를 상속받습니다 . 여기에는 마법이 없습니다. 커널이 버그가 있거나 (거의 없음) 자식이'SIGABRT'를 막거나 무시하고있는 것입니다. 다른 가능성은 없습니다. – Nemo

답변

0

자식 프로세스는 fork시 부모로부터 신호 마스크를 상속받습니다.

그래서 부모 프로세스가 SIGABRT를 차단하고 있다고 생각합니다 (sigprocmask or pthread_sigmask 경유).

+0

편집 된 질문에 언급 되었 듯이, 부모 프로세스는 실제로 SIGABRT를 무시하거나 차단하지 않으므로 상속은 중요하지 않습니다. 그러나 왜 신호가 아동 프로그램에 의해 수신되지 않는가에 대한 의문점이 남아 있습니까? – Quinn

1

man sigaction에서 인용 :

포크 (2)를 통해 생성 된 자식 부모의 신호의 복사본 위치 지워질 상속. execve (2) 중에 처리 된 신호 의 처분이 기본값으로 재설정됩니다. 무시 된 신호의 처분은 그대로 유지됩니다. .

내 생각에 서비스 프로세스는 SIGABRT를 무시하도록 설정되어 있으며 이는 하위 프로세스에 의해 상속됩니다.

관련 문제