Estou usando um manipulador de sinal com o campo siginfo_t
para reunir algumas informações, se o campo si_pid
for 0
, significa que o remetente do sinal é o mesmo que o recebe? Se esse for o caso, será igual a raise(int signum)
, certo?
Exemplo: O processo 1 envia SIGALRM, a saída do manipulador de sinal do Process 1 relativa a si_pid
é igual a 0, isso significa que é como se Process1 estivesse fazendo raise(SIGALRM)
?
Esta é a situação:
N processos instalam SIGARLM
e todo (BIRTH_DEATH/2)
segundo eu quero que eles enviem APENAS PARA SI (como se fosse um raise(SIGARLM)
) um alarme, eles têm o mesmo pgrp, pois si- > si_pid é 0 Eu não entendo se todos esses processos recebem os sinais dos outros ou não, devo usar algum masks
no sinal?
código de instalação para o SIGALRM (o mesmo para todos os processos):
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);
manipulando o código (eu sei que printf
não está bem aqui):
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);
}