Это работает. Во-первых, установите для SA_SIGINFO
значение .sa_flags
, чтобы обозначить интерес к дополнительной информации:
#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();
}
}
Во-вторых, создайте собственное приложение kill (er), способное отправлять такую дополнительную информацию:
#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);
}
Вы можете попробовать скомпилировать эти два файла, и вы сможете использовать второй исполняемый файл для отправки целых чисел первому ( ./ second pid int
).
На страницах руководства вы найдете дополнительную информацию о том, как это сделать.