GNU/Linux >> Belajar Linux >  >> Linux

Penanganan sinyal UNIX/Linux:SIGEV_THREAD

struct sigevent bukan tentang menentukan bagaimana proses akan menangani sinyal - struct sigaction dan sigaction() adalah bagaimana Anda melakukannya. Sebagai gantinya, struct sigevent digunakan untuk menentukan bagaimana proses Anda akan diberi tahu tentang beberapa peristiwa asinkron - seperti penyelesaian IO asinkron, atau penghitung waktu kedaluwarsa.

sigev_notify bidang menentukan bagaimana acara harus diberitahukan:

  • SIGEV_NONE - tidak ada pemberitahuan sama sekali. Bidang yang tersisa diabaikan.
  • SIGEV_SIGNAL - sinyal dikirim ke proses. sigev_signo bidang menentukan sinyal, sigev_value kolom berisi data tambahan yang diteruskan ke fungsi penanganan sinyal, dan kolom sisanya diabaikan.
  • SIGEV_THREAD - suatu fungsi dipanggil di utas baru. sigev_notify_function bidang menentukan fungsi yang dipanggil, sigev_value berisi data tambahan yang diteruskan ke fungsi, dan sigev_notify_attributes menentukan atribut utas yang akan digunakan untuk pembuatan utas. Bidang yang tersisa diabaikan.

Perhatikan khususnya jika Anda menyetel SIGEV_THREAD , sigev_signo kolom diabaikan - struct sigevent adalah tentang menentukan keduanya utas atau sinyal sebagai metode pemberitahuan, bukan tentang menentukan utas sebagai cara penanganan sinyal.

struct sigevent juga harus diteruskan ke fungsi - seperti timer_create() - yang mengatur acara asinkron yang akan diberitahukan. Cukup membuat struct sigevent objek tidak melakukan sesuatu yang istimewa.

Jika Anda ingin menggunakan utas khusus untuk menangani sinyal, buat utas di depan dan putar, blokir di sigwaitinfo() . Gunakan sigprocmask() untuk memblokir sinyal di setiap utas lainnya.


Saya pikir Anda mencampur idiom penanganan sinyal Anda di sini, Anda membuat sigevent struktur dan kemudian tidak melakukan apa-apa dengan itu dan kemudian menggunakan signal() dalam penangan sinyal. Kode berikut menunjukkan rutinitas penanganan sinyal yang sangat sederhana berdasarkan kode Anda; perhatikan bahwa saya telah mengubah definisi my_handler . Jika Anda membutuhkan penanganan yang lebih canggih maka sigaction() mungkin panggilan sistem yang perlu Anda perhatikan.

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

Ini berfungsi di bawah cygwin di kotak windows saya (tidak ada akses ke kotak linux saat ini).


Linux
  1. Migrasi Unix ke Linux

  2. Linux – Apakah Kernel Linux/unix yang Berbeda Dapat Dipertukarkan?

  3. UNIX / Linux:10 Contoh Perintah Netstat

  1. Perbedaan Utama Linux Vs UNIX Kernel

  2. Layanan OS Linux / UNIX:autofs

  3. Apakah Linux itu Unix?

  1. Linux vs. Unix:Apa bedanya?

  2. Linux – Apakah Linux Sebuah Unix?

  3. 50 Tutorial Sysadmin UNIX / Linux