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_signo
pole určuje signál,sigev_value
pole 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_function
pole určuje funkci, která je volána,sigev_value
obsahuje doplňková data, která jsou předána funkci, asigev_notify_attributes
urč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).