Pengaturcaraan C

Cara menggunakan fungsi SIGALRM dan penggera dalam bahasa C?

Cara menggunakan fungsi SIGALRM dan penggera dalam bahasa C?
The penggera () fungsi digunakan untuk menghasilkan a SIGALRM isyarat setelah jangka masa yang ditentukan berlalu. Dalam artikel ini, kami akan menunjukkan kepada anda cara menggunakan penggera () fungsi dan SIGALRM isyarat di Linux. Oleh itu, mari kita mulakan.

Sintaks

penggera int yang tidak ditandatangani (saat int yang tidak ditandatangani)

Fungsi ditentukan dalam tidak terkawal.h fail pengepala.

Hujah

Fungsi itu mengambil satu argumen, saat. Selepas saat detik telah berlalu sejak meminta penggera() fungsi, yang SIGALRM isyarat dihasilkan. Kelakuan lalai semasa penerimaan SIGALRM adalah untuk menghentikan proses. Tetapi, kita dapat menangkap dan mengendalikan isyarat. Lihat perincian pengendalian isyarat.

The penggera () fungsi akan mengembalikan nilai bukan sifar, jika penggera lain telah ditetapkan sebelumnya dan nilainya adalah jumlah detik yang tersisa untuk penggera berjadual sebelumnya kerana dihantar. Jika tidak penggera () akan kembali sifar.

Contoh1.c:

#sertakan
#sertakan
#sertakan
 
batal sig_handler (int signum)
 
printf ("Fungsi pengendali dalam \ n");

 
int utama ()
 
isyarat (SIGALRM, sig_handler); // Daftar pengendali isyarat
 
penggera (2); // Penggera berjadual selepas 2 saat
 
untuk (int i = 1 ;; i ++)
 
printf ("% d: Di dalam fungsi utama \ n", i);
tidur (1); // Kelewatan selama 1 saat

pulangan 0;

Dalam tangkapan skrin output dari Contoh1.c, program dijalankan dengan menggunakan perintah waktu, sehingga kita dapat memperoleh gambaran keseluruhan waktu pelaksanaan program. Kami memerhatikan bahawa dalam fungsi utama kami memanggil penggera () berfungsi, dijadualkan selama 2 saat. Jadi, untuk loop dijalankan, setelah 2 detik fungsi sig_handler dipanggil dan pelaksanaan fungsi utama dijeda. Setelah pelaksanaan fungsi sig_handler, fungsi utama untuk pelaksanaan gelung disambung semula. Di sini kita menggunakan fungsi tidur untuk menunda sehingga kita dapat memahami aliran pelaksanaannya. Gelung untuk adalah gelung tanpa batas, ketika kita menekan kekunci interrupt (Ctrl + C), pelaksanaan akan berhenti.

Menjana SIGALRM menggunakan isyarat() fungsi tidak dapat disusun. Hanya satu SIGALRM penjanaan dapat dijadualkan. Panggilan berturut-turut dari isyarat() fungsi menetapkan semula jam penggera proses panggilan.

Contoh2.c:

#sertakan
#sertakan
#sertakan
 
batal sig_handler (int signum)
 
printf ("Fungsi pengendali dalam \ n");

 
int utama ()
 
isyarat (SIGALRM, sig_handler); // Daftar pengendali isyarat
 
penggera (4); // Penggera berjadual selepas 4 saat
penggera (1); // Penggera berjadual selepas 1 saat
 
untuk (int i = 1 ;; i ++)
 
printf ("% d: Di dalam fungsi utama \ n", i);
tidur (1); // Kelewatan selama 1 saat

 
pulangan 0;

Dalam tangkapan skrin output dari Contoh2.c, kita dapat melihat bahawa program dijalankan lebih dari 7 saat tetapi penggera pertama yang dijadualkan selepas 4 saat tidak memanggil fungsi pengendali. Penggera kedua yang dijadualkan selepas 1 saat adalah menetapkan semula penggera.

Sekiranya nilai detik argumen adalah sifar, maka permintaan penggera yang dibuat sebelumnya akan dibatalkan.

Contoh3.c:

#sertakan
#sertakan
#sertakan
 
batal sig_handler (int signum)
 
printf ("Fungsi pengendali dalam \ n");

 
int utama ()
 
isyarat (SIGALRM, sig_handler); // Daftar pengendali isyarat
 
penggera (2); // Penggera berjadual selepas 2 saat
penggera (0); // Membatalkan penggera sebelumnya
 
untuk (int i = 1 ;; i ++)
 
printf ("% d: Di dalam fungsi utama \ n", i);
tidur (1); // Kelewatan selama 1 saat

 
pulangan 0;

Dalam tangkapan skrin output dari Contoh3.c, kita dapat melihat bahawa penggera pertama yang dijadualkan selepas 2 saat dibatalkan kerana penggera kedua selama 0 saat.

Dalam Contoh4.c kita akan melihat secara berterusan bagaimana kita boleh menetapkan penggera untuk setiap 2 saat.

Contoh4.c:

#sertakan
#sertakan
#sertakan
 
batal sig_handler (int signum)
 
printf ("Fungsi pengendali dalam \ n");
 
penggera (2); // Jadualkan penggera baru selepas 2 saat

 
int utama ()
 
isyarat (SIGALRM, sig_handler); // Daftar pengendali isyarat
 
penggera (2); // Jadualkan penggera pertama selepas 2 saat
 
untuk (int i = 1 ;; i ++)
 
printf ("% d: Di dalam fungsi utama \ n", i);
jeda (); // menunggu sehingga isyarat dikendalikan

 
pulangan 0;

Dalam tangkapan skrin output dari Contoh4.c, kita dapat melihat bahawa penggera berterusan dalam setiap 2 saat. Kami menetapkan semula penggera dalam fungsi sig_handler.

Dalam Contoh5.c kita akan melihat bagaimana kita boleh menangguhkan penggera yang telah dijadualkan. Kami akan menggunakan isyarat SIGINT untuk gangguan. Semasa pengguna taip Ctrl + C di papan kekunci, TANDATANGAN isyarat akan menghasilkan.

Contoh5.c:

#sertakan
#sertakan
#sertakan
 
batal sig_handler (int signum)
 
if (signum == SIGALRM) // pengendali isyarat untuk SIGALRM
 
printf ("Fungsi pengendali dalam untuk SIGALRM \ n");
penggera (2);

if (signum == SIGINT) // pengendali isyarat untuk SIGINT
printf ("\ nTunda selama 5 saat ... \ n");
penggera (5);

 

 
int utama ()
 
isyarat (SIGALRM, sig_handler); // Daftar pengendali isyarat untuk SIGALRM
isyarat (SIGINT, sig_handler); // Daftar pengendali isyarat untuk SIGINT
 
penggera (2); // Jadualkan penggera pertama selepas 2 saat
 
untuk (int i = 1 ;; i ++)
 
printf ("% d: Di dalam fungsi utama \ n", i);
jeda (); // menunggu sehingga isyarat dikendalikan

 
pulangan 0;

Dalam tangkapan skrin output dari Contoh5.c, kita dapat melihat bahawa apabila pengguna jenis Ctrl + C penggera diset semula 5 saat. Dalam program ini, kami hanya menggunakan satu fungsi pengendali untuk dua isyarat yang berbeza tetapi dalam fungsi pengendali telah diperiksa apakah fungsi fungsi pengendali dipanggil.

Kesimpulan:

Oleh itu, kita telah melihat bagaimana fungsi penggera dapat diatur untuk memicu isyarat, bagaimana mengatur semula penggera, bagaimana membatalkan penggera yang sudah dijadualkan.

SuperTuxKart untuk Linux
SuperTuxKart adalah tajuk hebat yang direka untuk membawa anda pengalaman Mario Kart secara percuma pada sistem Linux anda. Ia cukup mencabar dan meny...
Tutorial Battle for Wesnoth
The Battle for Wesnoth adalah salah satu permainan strategi sumber terbuka paling popular yang boleh anda mainkan pada masa ini. Bukan hanya permainan...
0 A.D. Tutorial
Daripada banyak permainan strategi di luar sana, 0 A.D. berjaya menonjol sebagai tajuk yang komprehensif dan permainan taktikal yang sangat mendalam w...