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_signobidang menentukan sinyal,sigev_valuekolom berisi data tambahan yang diteruskan ke fungsi penanganan sinyal, dan kolom sisanya diabaikan.SIGEV_THREAD- suatu fungsi dipanggil di utas baru.sigev_notify_functionbidang menentukan fungsi yang dipanggil,sigev_valueberisi data tambahan yang diteruskan ke fungsi, dansigev_notify_attributesmenentukan 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).