struct sigevent nejde o specifikaci toho, jak bude proces zpracovávat signál - struct sigaction a sigaction() jak to děláš. Místo toho struct sigevent se používá k určení, jak bude váš proces informován o nějaké asychronní události – jako je dokončení asynchronní IO nebo vypršení časovače.
sigev_notify pole určuje, jak má být událost oznámena:
SIGEV_NONE- vůbec žádné upozornění. Zbývající pole jsou ignorována.SIGEV_SIGNAL- do procesu je vyslán signál.sigev_signopole určuje signál,sigev_valuepole obsahuje doplňková data, která jsou předána funkci zpracování signálu, a zbývající pole jsou ignorována.SIGEV_THREAD- funkce je volána v novém vlákně.sigev_notify_functionpole určuje funkci, která je volána,sigev_valueobsahuje doplňková data, která jsou předána funkci, asigev_notify_attributesurčuje atributy vlákna, které se mají použít pro vytvoření vlákna. Zbývající pole jsou ignorována.
Všimněte si zejména, že pokud nastavíte SIGEV_THREAD , sigev_signo pole je ignorováno – struct sigevent jde o zadání buď vlákno nebo signál jako způsob upozornění, nikoli o určení vlákna jako způsobu, jakým by se signál měl zpracovávat.
struct sigevent musí být také předán funkci – například timer_create() - která nastaví asynchronní událost, která bude upozorněna. Jednoduše vytvořte struct sigevent objekt nedělá nic zvláštního.
Chcete-li pro zpracování signálu použít vyhrazené vlákno, vytvořte vlákno vpředu a nechte ho smyčkou, blokování na sigwaitinfo() . Použijte sigprocmask() k blokování signálu v každém druhém vláknu.
Myslím, že si zde pletete své idiomy pro zpracování signálu, vytvoříte sigevent struktura a pak s tím nic nedělejte a pak použijte signal() v ovladači signálu. Následující kód ukazuje velmi jednoduchou rutinu zpracování signálů založenou na vašem kódu; všimněte si, že jsem změnil definici my_handler . Pokud potřebujete sofistikovanější ovládání, pak sigaction() je pravděpodobně systémové volání, na které se musíte podívat.
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
void my_handler(int sig)
{
printf("my_handler caught\n");
signal(sig,my_handler);
}
int main()
{
signal(SIGRTMIN,my_handler);
kill(0,SIGRTMIN); // This should invoke the signal and call the function
while(1) ; // Infinite loop in case the program ends before the signal gets caught!
}
Toto funguje pod cygwin na mém Windows boxu (v tuto chvíli žádný přístup k linuxovému boxu).