Isso funciona. Primeiro, defina SA_SIGINFO
para .sa_flags
para sinalizar um interesse em informações adicionais:
#include <signal.h>
#include <unistd.h>
void act(int s, siginfo_t *i, void *v)
{
//printing from here is unsafe but this is for testing
//purposes only
printf("pid=%d val=%d\n", i->si_pid, i->si_value.sival_int);
}
int main(int argc, char **argv)
{
struct sigaction sa = {
.sa_sigaction=act ,
.sa_flags = SA_RESTART|SA_SIGINFO
} ;
sigaction(SIGUSR1, &sa, NULL);
printf("%d\n", (int)getpid());
for(;;){
pause();
}
}
Em segundo lugar, crie seu próprio aplicativo kill (er) capaz de enviar informações extras:
#include <signal.h>
#include <unistd.h>
int main(int argc, char**argv)
{
union sigval val = { .sival_int = atoi(argv[2]) };
sigqueue((pid_t)atoi(argv[1]), SIGUSR1, val);
}
Você pode tentar compilar esses dois e deverá usar o segundo executável para enviar inteiros ao primeiro ( ./second pid int
).
As páginas de manual devem fornecer mais informações sobre como criar isso.