홈>
Linux에서 실행되는 C로 간단한 데몬을 작성했습니다. 신호 마스크를 올바르게 설정하는 방법을 이해하려고합니다. 데몬에 다음 코드가 있습니다.
struct sigaction new_sig_action;
sigset_t new_sig_set;
/* Set signal mask - signals we want to block */
sigemptyset(&new_sig_set);
sigaddset(&new_sig_set, SIGCHLD); /* ignore child - i.e. we don't need to wait for it */
sigaddset(&new_sig_set, SIGTSTP); /* ignore Tty stop signals */
sigaddset(&new_sig_set, SIGTTOU); /* ignore Tty background writes */
sigaddset(&new_sig_set, SIGTTIN); /* ignore Tty background reads */
sigprocmask(SIG_BLOCK, &new_sig_set, NULL); /* Block the above specified signals */
/* Set up a signal handler */
new_sig_action.sa_handler = signal_handler;
sigemptyset(&new_sig_action.sa_mask);
new_sig_action.sa_flags = 0;
/* Signals to handle */
sigaction(SIGHUP, &new_sig_action, NULL); /* catch hangup signal */
sigaction(SIGTERM, &new_sig_action, NULL); /* catch term signal */
sigaction(SIGINT, &new_sig_action, NULL); /* catch interrupt signal */
여기서 signal_handler는 정의 된 함수입니다. 이 스레드 .
이제 다른 환경 (동일한 사용자, 동일한 시스템)에서 데몬이 시작될 때 블록 마스크가 달라지는 문제를 추적했습니다. 명령 행에서 데몬을 시작하면 다음과 같은 'ps'출력이 생성됩니다.
> ps -C powid -o pid,ppid,command,blocked,caught,ignored
PID PPID COMMAND BLOCKED CAUGHT IGNORED
11406 1 ./powid 0000000000390000 0000000180004003 0000000000000000
그리고 PHP 스크립트를 통해 똑같은 데몬을 시작할 때, 다음을 산출합니다 :
> ps -C powid -o pid,ppid,command,blocked,caught,ignored
PID PPID COMMAND BLOCKED CAUGHT IGNORED
11491 1 ./powid fffffffe3bfbe207 0000000180004003 00000000010010
제 질문은 차단 마스크가 다른 이유입니다. 내 이해는 주어진 C 코드가 모든 조건에서 차단 마스크를 동일하게 강제 할 것이라고 제안합니다.
-
답변 # 1
관련 자료
- rhel - Windows 클라이언트 용 Linux 호스트와 파일 공유를위한 Samba 설정
- service - 자동 재시작 PHP 데몬 설정
- qt - 리눅스에서 qtcreator로 안드로이드 개발 설정하기
- 파이썬의 데몬은 쓸모없는/좀비 리눅스 프로세스를 생성합니다
- python - psutil과 마찬가지로 Linux에서 데몬 (서비스) 프로세스를 나열하는 방법은 무엇입니까?
- c - SIGUSR1 신호를 전송하여 데몬을 즉시 깨우는 방법
- 결과를 설정하기 위해 bash 또는 jq를 사용하여 Linux에서 Json 파일을 구문 분석하는 방법
- C/Linux에서 분기 된 하위 프로세스에 신호
관련 질문
- c - 신호와 함께 수면에서 프로세스 깨우기
- c - ioctl KVM_RUN은 어떤 조건에서 반환됩니까?
- linux - C 언어로 일기를 어떻게 만드나요?
- linux - C에서 프롬프트를 만드는 방법
- Linux에서 C를 사용하여 다른 응용 프로그램을 닫는 방법이 있습니까?
- c - / usr/share에 디렉토리를 만들 수 없습니다
- c - copy_to_user ()는 메시지를 무한대로 인쇄합니다
- Linux에서 명시 적으로 동기화하지 않고 런타임시 일관된 파일에 대한 별도의 IO 액세스 차단
- c - 애플리케이션의 강력한 정상 종료
- linux - C에서 두 자녀와 함께 파이프에서 어떻게 읽습니까?
libc 문서는 다음과 같이 기술합니다 :
와이즈 비즈차단 된 마스크가 다른 이유에 대한 대답은 부모가 다른 마스크를 사용했기 때문입니다 ...
를 사용하기 때문에 C 코드에추가한 신호가 차단 목록에 추가되었습니다. 첫 번째 매개 변수를sigprocmask
로 설정 . 신호 마스크를 덮어 쓰려면SIG_BLOCK
를 사용하십시오. . 이를 통해 부모 독립 신호 블록 마스크를 사용해야합니다.SIG_SETMASK