#include #include #include static int failed; static pid_t pid; static uid_t uid; static sem_t sem; static int is_kill; #define THESIG SIGRTMIN static void sh (int sig, siginfo_t *si, void *ctx) { if (sig != si->si_signo) { printf ("sig != si->si_signo: %d vs %d\n", sig, (int) si->si_signo); failed = 1; } if (si->si_code != is_kill ? SI_USER : SI_QUEUE) { printf ("si->si_code wrong: %d\n", si->si_code); failed = 1; } if (si->si_pid != pid) { printf ("si->si_pid wrong: %d vs %d\n", (int) si->si_pid, (int) pid); failed = 1; } if (si->si_uid != uid) { printf ("si->si_uid wrong: %d vs %d\n", (int) si->si_uid, (int) uid); failed = 1; } sem_post (&sem); } static void * tf (void *arg) { puts ("trying kill"); is_kill = 1; kill (pid, THESIG); sem_wait (&sem); puts ("trying sigqueue"); sigval_t sv; sv.sival_int = 42; is_kill = 0; sigqueue (pid, THESIG, sv); sem_wait (&sem); } int main (void) { pid = getpid (); uid = getuid (); struct sigaction sa; sa.sa_sigaction = sh; sa.sa_flags = SA_SIGINFO; sigemptyset (&sa.sa_mask); sigaction (THESIG, &sa, NULL); sem_init (&sem, 0, 0); pthread_t th; puts ("starting 1st thread"); pthread_create (&th, NULL, tf, NULL); pthread_join (th, NULL); puts ("starting 2nd thread"); pthread_create (&th, NULL, tf, NULL); pthread_join (th, NULL); return failed; }