Pemrograman C

Cara menggunakan SIGALRM dan fungsi alarm dalam bahasa C?

Cara menggunakan SIGALRM dan fungsi alarm dalam bahasa C?
Itu alarm() fungsi digunakan untuk menghasilkan SIGALRM sinyal setelah jangka waktu tertentu berlalu. Pada artikel ini, kami akan menunjukkan cara menggunakan how alarm() fungsi dan SIGALRM sinyal di Linux. Jadi, mari kita mulai.

Sintaksis

alarm int unsigned (detik int unsigned)

Fungsi tersebut didefinisikan dalam unistd.h file header.

Argumen

Fungsi mengambil satu argumen, detik. Setelah detik detik telah berlalu sejak meminta alarm() fungsi, SIGALRM sinyal dihasilkan. Perilaku default saat menerima SIGALRM adalah untuk menghentikan proses. Tapi, kita bisa menangkap dan menangani sinyalnya. Lihat detail penanganan sinyal.

Itu alarm() fungsi akan mengembalikan nilai bukan nol, jika alarm lain telah disetel sebelumnya dan nilainya adalah jumlah detik yang tersisa untuk alarm terjadwal sebelumnya yang akan dikirim. Jika tidak alarm() akan kembali nol.

Contoh 1.c:

#termasuk
#termasuk
#termasuk
 
void sig_handler(int signum)
 
printf("Fungsi pengendali di dalam\n");

 
int utama()
 
sinyal(SIGALRM,sig_handler); // Daftarkan penangan sinyal
 
alarm (2); // Alarm terjadwal setelah 2 detik
 
untuk(int i=1;;i++)
 
printf("%d : Di dalam fungsi utama\n",i);
tidur(1); // Tunda selama 1 detik

kembali 0;

Dalam tangkapan layar dari output Contoh 1.c, program dijalankan menggunakan perintah waktu, sehingga kita bisa mendapatkan gambaran waktu eksekusi program. Kami mengamati bahwa dalam fungsi utama yang kami sebut alarm() fungsi, dijadwalkan selama 2 detik. Jadi, untuk loop sedang dijalankan, setelah 2 detik fungsi sig_handler dipanggil dan eksekusi fungsi utama dijeda. Setelah eksekusi fungsi sig_handler, dalam fungsi utama untuk eksekusi loop dilanjutkan. Di sini kami menggunakan fungsi sleep untuk menunda sehingga kami dapat memahami alur eksekusi. For loop adalah infinite loop, ketika kita menekan tombol interupsi (Ctrl+C), eksekusi akan berhenti.

Menghasilkan SIGALRM menggunakan sinyal() fungsi tidak dapat ditumpuk. Hanya satu SIGALRM generasi dapat dijadwalkan. Panggilan berturut-turut dari sinyal() fungsi mengatur ulang jam alarm dari proses panggilan.

Contoh2.c :

#termasuk
#termasuk
#termasuk
 
void sig_handler(int signum)
 
printf("Fungsi pengendali di dalam\n");

 
int utama()
 
sinyal(SIGALRM,sig_handler); // Daftarkan penangan sinyal
 
alarm (4); // Alarm terjadwal setelah 4 detik
alarm(1); // Alarm terjadwal setelah 1 detik
 
untuk(int i=1;;i++)
 
printf("%d : Di dalam fungsi utama\n",i);
tidur(1); // Tunda selama 1 detik

 
kembali 0;

Dalam tangkapan layar dari output Contoh2.c, kita dapat melihat bahwa program dijalankan lebih dari 7 detik tetapi alarm pertama yang dijadwalkan setelah 4 detik tidak memanggil fungsi handler. Alarm kedua yang dijadwalkan setelah 1 detik mengatur ulang alarm.

Jika nilai detik argumen adalah nol, maka permintaan alarm yang dibuat sebelumnya dibatalkan.

Contoh3.c:

#termasuk
#termasuk
#termasuk
 
void sig_handler(int signum)
 
printf("Fungsi pengendali di dalam\n");

 
int utama()
 
sinyal(SIGALRM,sig_handler); // Daftarkan penangan sinyal
 
alarm (2); // Alarm terjadwal setelah 2 detik
alarm(0); // Membatalkan alarm sebelumnya
 
untuk(int i=1;;i++)
 
printf("%d : Di dalam fungsi utama\n",i);
tidur(1); // Tunda selama 1 detik

 
kembali 0;

Dalam tangkapan layar dari output Contoh3.c, kita dapat melihat bahwa alarm pertama yang dijadwalkan setelah 2 detik dibatalkan karena alarm kedua selama 0 detik.

Di Contoh4.c kita akan melihat bagaimana terus menerus kita dapat mengatur alarm untuk setiap 2 detik.

Contoh4.c:

#termasuk
#termasuk
#termasuk
 
void sig_handler(int signum)
 
printf("Fungsi pengendali di dalam\n");
 
alarm (2); // Jadwalkan alarm baru setelah 2 detik

 
int utama()
 
sinyal(SIGALRM,sig_handler); // Daftarkan penangan sinyal
 
alarm (2); // Jadwalkan alarm pertama setelah 2 detik
 
untuk(int i=1;;i++)
 
printf("%d : Di dalam fungsi utama\n",i);
berhenti sebentar(); // menunggu sampai sinyal ditangani

 
kembali 0;

Dalam tangkapan layar dari output Contoh4.c, kita dapat melihat bahwa alarm terus menerus setiap 2 detik. Kami mengatur ulang alarm di fungsi sig_handler.

Di Contoh5.c kita akan melihat bagaimana kita dapat menunda alarm yang sudah dijadwalkan. Kami akan menggunakan sinyal SIGINT untuk interupsi. Saat pengguna mengetik Ctrl+C di keyboard, TANDA TANGAN sinyal akan menghasilkan.

Contoh5.c:

#termasuk
#termasuk
#termasuk
 
void sig_handler(int signum)
 
if(signum == SIGALRM)         //penangan sinyal untuk SIGALRM
 
printf("Fungsi pengendali di dalam untuk SIGALRM\n");
alarm (2);

if(signum == SIGINT)         // pengendali sinyal untuk SIGINT
printf("\nTunda selama 5 detik... \n");
alarm (5);

 

 
int utama()
 
sinyal(SIGALRM,sig_handler); // Daftarkan pengendali sinyal untuk SIGALRM
sinyal(SIGINT,sig_handler); // Daftarkan pengendali sinyal untuk SIGINT
 
alarm (2); // Jadwalkan alarm pertama setelah 2 detik
 
untuk(int i=1;;i++)
 
printf("%d : Di dalam fungsi utama\n",i);
berhenti sebentar(); // menunggu sampai sinyal ditangani

 
kembali 0;

Dalam tangkapan layar dari output Contoh5.c, kita dapat melihat bahwa ketika pengguna mengetik Ctrl + C, alarm disetel ulang 5 detik. Dalam program ini kita hanya menggunakan satu fungsi handler untuk dua sinyal yang berbeda tetapi dalam fungsi handler telah diperiksa untuk sinyal mana fungsi handler dipanggil.

Kesimpulan:

Jadi, kita telah melihat bagaimana fungsi alarm dapat diatur untuk memicu sinyal, cara mengatur ulang alarm, cara membatalkan alarm yang sudah dijadwalkan.

Instal Dolphin Emulator terbaru untuk Gamecube & Wii di Linux
Dolphin Emulator memungkinkan Anda memainkan game Gamecube & Wii pilihan Anda di Komputer Pribadi (PC) Linux. Menjadi emulator game sumber terbuka da...
Cara Menggunakan Cheat Engine GameConqueror di Linux
Artikel ini mencakup panduan tentang menggunakan mesin cheat GameConqueror di Linux. Banyak pengguna yang bermain game di Windows sering menggunakan a...
Emulator Konsol Game Terbaik untuk Linux
Artikel ini akan mencantumkan perangkat lunak emulasi konsol game populer yang tersedia untuk Linux. Emulasi adalah lapisan kompatibilitas perangkat l...