我正在使用带有siginfo_t
字段的信号处理程序来收集一些信息,如果该字段si_pid
是0
,则意味着信号的发送者与接收者相同?如果是这样的话就等于raise(int signum)
对吧?
示例:进程1发送SIGALRM,进程1信号处理程序的输出相对于si_pid
等于0,这意味着它就像进程1正在做什么raise(SIGALRM)
?
情况是这样的:
N 个进程安装SIGARLM
,每秒(BIRTH_DEATH/2)
我希望它们只向自己发送一个警报(就像它是一个raise(SIGARLM)
),它们具有相同的 pgrp,因为 si->si_pid 是 0 我不明白是否所有这些进程都收到其他进程的信号或不,我应该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);
}