GNU/Linux >> Znalost Linux >  >> Linux

Zpracování signálů UNIX/Linux:SIGEV_THREAD

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, a sigev_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).


Linux
  1. UNIX / Linux:10 příkladů příkazů Netstat

  2. 50 Výukové programy Sysadmin pro UNIX / Linux

  3. UNIX / Linux:3 způsoby odesílání signálu do procesů

  1. Zpracování signálu s více vlákny v Linuxu

  2. Ctrl + C přerušení zpracování událostí v Linuxu

  3. Je Linux Unix?

  1. Linux vs. Unix:Jaký je rozdíl?

  2. Migrace Unixu na Linux

  3. Linux – Je Linux Unix?