siginfo_t
일부 정보를 수집하기 위해 필드가 있는 신호 처리기를 사용하고 있습니다 . 필드가 si_pid
이면 0
신호의 발신자가 수신자와 동일하다는 의미입니까? 그렇다면 마찬가지겠죠 raise(int signum)
?
예: 프로세스 1은 SIGALRM을 보냅니다. 프로세스 1 신호 처리기의 출력은 si_pid
0에 상대적입니다. 이는 프로세스 1이 수행하는 작업과 유사하다는 의미입니다 raise(SIGALRM)
.
상황은 이렇습니다.
N 프로세스가 설치되었습니다 SIGARLM
. 매초마다 (BIRTH_DEATH/2)
하나의 경고만 자신에게 보내기를 원합니다(예: 하나 raise(SIGARLM)
). si->si_pid가 0이므로 동일한 pgrp를 갖습니다. 이 모든 프로세스가 다른 프로세스의 신호를 받는지 이해가 안 됩니다. 아니요, masks
신호에 일부를 사용해야 합니까 ?
SIGALRM 설치 코드(모든 프로세스에 동일):
sa_target.sa_sigaction = &a_target_reduce;
sa_target.sa_flags = SA_NODEFER | SA_RESTART | SA_SIGINFO;
sigemptyset(&my_mask_target);
sa_target.sa_mask = my_mask_target;
sigaction(SIGALRM, &sa_target, NULL);
alarm(BIRTH_DEATH/2);
printf
처리 코드( 여기서는 좋지 않다는 것을 알고 있습니다 ):
void a_target_reduce(int signal, siginfo_t *si, void *context) {
printf("I'm %d received signal from %d real id %d\n", getpid(), si->si_pid, si->si_uid);
counter_reduce++;
alarm(BIRTH_DEATH/2);
}