GNU/Linux >> LINUX-Kenntnisse >  >> Linux

UNIX/Linux-Signalverarbeitung:SIGEV_THREAD

struct sigevent geht es nicht darum, anzugeben, wie der Prozess mit einem Signal umgehen soll - struct sigaction und sigaction() so machst du das. Stattdessen struct sigevent wird verwendet, um anzugeben, wie Ihr Prozess über ein asynchrones Ereignis informiert wird - wie z. B. den Abschluss einer asynchronen E/A oder das Ablaufen eines Timers.

Die sigev_notify Feld gibt an, wie das Ereignis benachrichtigt werden soll:

  • SIGEV_NONE - überhaupt keine Benachrichtigung. Die restlichen Felder werden ignoriert.
  • SIGEV_SIGNAL - Ein Signal wird an den Prozess gesendet. Die sigev_signo Feld spezifiziert das Signal, den sigev_value enthält ergänzende Daten, die an die Signalverarbeitungsfunktion übergeben werden, und die restlichen Felder werden ignoriert.
  • SIGEV_THREAD - Eine Funktion wird in einem neuen Thread aufgerufen. Die sigev_notify_function Feld gibt die aufgerufene Funktion an, sigev_value enthält ergänzende Daten, die an die Funktion übergeben werden, und sigev_notify_attributes gibt Thread-Attribute an, die für die Thread-Erstellung verwendet werden sollen. Die restlichen Felder werden ignoriert.

Beachten Sie insbesondere, dass wenn Sie SIGEV_THREAD setzen , die sigev_signo Feld wird ignoriert - der struct sigevent geht es darum, entweder anzugeben ein Thread oder ein Signal als Benachrichtigungsmethode, nicht darum, einen Thread als Art und Weise anzugeben, wie ein Signal gehandhabt werden soll.

Die struct sigevent muss auch an eine Funktion übergeben werden - wie timer_create() - das das asynchrone Ereignis einrichtet, das benachrichtigt wird. Einfach einen struct sigevent erstellen Objekt macht nichts Besonderes.

Wenn Sie einen dedizierten Thread verwenden möchten, um ein Signal zu verarbeiten, erstellen Sie den Thread im Voraus und lassen Sie ihn herumschleifen und auf sigwaitinfo() blockieren . Verwenden Sie sigprocmask() um das Signal in jedem anderen Thread zu blockieren.


Ich glaube, Sie verwechseln hier Ihre Signalhandhabungssprache, Sie erstellen einen sigevent Struktur und dann nichts damit machen und dann signal() verwenden innerhalb des Signalhandlers. Der folgende Code zeigt eine sehr einfache Signalbehandlungsroutine, die auf Ihrem Code basiert; Beachten Sie, dass ich die Definition von my_handler geändert habe . Wenn Sie eine anspruchsvollere Handhabung benötigen, dann sigaction() ist wahrscheinlich der Systemaufruf, den Sie untersuchen müssen.

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

Dies funktioniert unter cygwin auf meiner Windows-Box (momentan kein Zugriff auf eine Linux-Box).


Linux
  1. Linux vs. Unix:Was ist der Unterschied?

  2. Linux – Sind verschiedene Linux/Unix-Kernel austauschbar?

  3. UNIX / Linux:10 Netstat-Befehlsbeispiele

  4. Hauptunterschiede zwischen Linux und UNIX-Kernel

  5. Strg + C Interrupt-Ereignisbehandlung in Linux

mkdir-Befehl unter Linux/Unix

Linux gegen Unix

Grep-Befehl unter Linux/UNIX

ls-Befehl unter Linux/UNIX

cp-Befehl unter Linux/UNIX

Finden Sie Befehl in Linux/UNIX