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, dansigev_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).