GNU/Linux >> Linux Esercitazione >  >> Linux

Gestione dei segnali UNIX/Linux:SIGEV_THREAD

struct sigevent non si tratta di specificare come il processo gestirà un segnale - struct sigaction e sigaction() ecco come lo fai. Invece, struct sigevent viene utilizzato per specificare in che modo il tuo processo verrà informato di un evento asincrono, come il completamento dell'IO asincrono o la scadenza di un timer.

Il sigev_notify Il campo specifica come deve essere notificato l'evento:

  • SIGEV_NONE - nessuna notifica. Il resto dei campi viene ignorato.
  • SIGEV_SIGNAL - viene inviato un segnale al processo. Il sigev_signo il campo specifica il segnale, il sigev_value Il campo contiene dati supplementari che vengono passati alla funzione di gestione del segnale e il resto dei campi viene ignorato.
  • SIGEV_THREAD - una funzione viene chiamata in un nuovo thread. Il sigev_notify_function Il campo specifica la funzione che viene chiamata, sigev_value contiene dati supplementari che vengono passati alla funzione e sigev_notify_attributes specifica gli attributi del thread da utilizzare per la creazione del thread. Il resto dei campi viene ignorato.

Nota in particolare che se imposti SIGEV_THREAD , il sigev_signo campo viene ignorato - il struct sigevent si tratta di specificare o un thread o un segnale come metodo di notifica, non sullo specificare un thread come il modo in cui un segnale dovrebbe essere gestito.

Il struct sigevent deve anche essere passato a una funzione, come timer_create() - che imposta l'evento asincrono che verrà notificato. Semplicemente creando un struct sigevent oggetto non fa niente di speciale.

Se desideri utilizzare un thread dedicato per gestire un segnale, crea il thread in primo piano e fallo girare intorno, bloccando su sigwaitinfo() . Usa sigprocmask() per bloccare il segnale in ogni altro thread.


Penso che tu stia confondendo i tuoi idiomi di gestione del segnale qui, crei un sigevent structure e poi non fare nulla con esso e quindi utilizzare signal() all'interno del gestore del segnale. Il codice seguente mostra una routine di gestione del segnale molto semplice basata sul codice; nota che ho cambiato la definizione di my_handler . Se hai bisogno di una gestione più sofisticata allora sigaction() è probabilmente la chiamata di sistema che devi esaminare.

#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!
}

Funziona sotto cygwin sulla mia macchina Windows (nessun accesso a una macchina Linux al momento).


Linux
  1. Linux:Linux è un Unix?

  2. 50 tutorial per amministratori di sistema UNIX/Linux

  3. UNIX / Linux:3 modi per inviare segnali ai processi

  4. Gestione del segnale con più thread in Linux

  5. Linux è un Unix?

comando mkdir in Linux/Unix

Linux vs Unix

Comando Grep in Linux/UNIX

comando ls in Linux/UNIX

comando cp in Linux/UNIX

Trova comando in Linux/UNIX