>

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

    libc 문서는 다음과 같이 기술합니다 :

    와이즈 비즈

    차단 된 마스크가 다른 이유에 대한 대답은 부모가 다른 마스크를 사용했기 때문입니다 ...

    Each process has its own signal mask. When you create a new process (see Creating a Process), it inherits its parent’s mask.

    를 사용하기 때문에 C 코드에추가한 신호가 차단 목록에 추가되었습니다.  첫 번째 매개 변수를 sigprocmask 로 설정 . 신호 마스크를 덮어 쓰려면 SIG_BLOCK 를 사용하십시오. . 이를 통해 부모 독립 신호 블록 마스크를 사용해야합니다.

    SIG_SETMASK

  • 이전 java - Couchebase는 Couchebase에서 글로벌 보조 인덱스를 만듭니다
  • 다음 apache spark sql - Java를 사용하여 Parquet 파일 크기와 줄 수를 얻는 방법은 무엇입니까?