2017-05-12 5 views
2

리눅스에서 실행되는 간단한 데몬을 C로 작성했습니다. 신호 마스크를 올바르게 설정하는 방법을 이해하려고합니다. 내 데몬에 다음 코드가있다.리눅스 C 데몬에서 신호 마스크 설정하기

여기서 signal_handler는 정의 된 함수이다. 이 thread에 설명되어있는 데몬 중지 문제가 있습니다.

다른 환경 (동일한 사용자, 동일한 시스템)에서 데몬이 시작될 때 블록 마스크의 문제점을 추적했습니다. 다음 'PS'출력 명령 줄에서 데몬을 산출 시작 : PHP 스크립트를 통해 동일한 데몬을 시작할 때,

> ps -C powid -o pid,ppid,command,blocked,caught,ignored 
PID PPID COMMAND        BLOCKED   CAUGHT  IGNORED 
11406  1 ./powid      0000000000390000 0000000180004003 0000000000000000 

는 수율 :

> ps -C powid -o pid,ppid,command,blocked,caught,ignored       
PID PPID COMMAND        BLOCKED   CAUGHT  IGNORED 
11491  1 ./powid      fffffffe3bfbe207 0000000180004003 00000000010010 

내 질문은 왜이다 차단 된 마스크가 다릅니다. 내 이해는 주어진 C 코드가 차단 된 마스크를 모든 조건에서 동일하게 만들 것을 제안한다.

+0

PHP 인터프리터가 그렇게하기 때문에. PHP를 사용하지 마십시오. – 0andriy

+0

도움이되지 않습니다. 불행히도 – Marius

+0

알다시피, PHP는 프로그래밍 언어도 좋은 환경도 아닙니다. 누구든지 그것을 고의로 선택했습니다. 따라서 고통은 번들의 일부입니다. – 0andriy

답변

1

libc documentation 상태 :

각 프로세스 자체의 신호 마스크를 갖는다. 새 프로세스를 만들 때 (프로세스 만들기 참조) 부모의 마스크를 상속합니다. 부모가 서로 다른 마스크를 가지고 사용했기 때문에

그래서 차단 마스크가 다른 이유에 대한 대답은 당신이 sigprocmask을 사용하기 때문에

당신의 주어진 C 코드 가 차단 목록에 일부 신호를 추가입니다 ... 첫 번째 매개 변수는 SIG_BLOCK으로 설정됩니다. 신호 마스크를 덮어 쓰려면 SIG_SETMASK을 사용하십시오. 이를 통해 부모 독립 신호 블록 마스크로 끝내야합니다.

+0

고맙습니다. 문제가 해결되었습니다. 나는 분명히 SIG_BLOCK과 SIG_SETMASK의 차이를 알지 못했지만, 문서는 그것을 정리했다. 답변 해주셔서 감사합니다. – Marius