Saat Anda menekan Ctr + C , sistem operasi mengirimkan sinyal ke proses. Ada banyak sinyal dan salah satunya adalah SIGINT. SIGINT ("interupsi program") adalah salah satu Sinyal Pemutusan.
Ada beberapa jenis Sinyal Pemutusan, tetapi yang menarik tentang SIGINT adalah dapat ditangani (ditangkap) oleh program Anda. Tindakan default SIGINT adalah penghentian program. Artinya, jika program Anda tidak secara khusus menangani sinyal ini, saat Anda menekan Ctr + C program Anda berakhir sebagai tindakan default.
Untuk mengubah tindakan default sinyal, Anda harus mendaftarkan sinyal untuk ditangkap. Untuk mendaftarkan sinyal dalam program C (setidaknya di bawah sistem POSIX) ada dua fungsi
- sinyal(int signum, penangan sighandler_t);
- sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);.
Fungsi-fungsi ini membutuhkan header signal.h untuk disertakan dalam kode C Anda. Saya telah memberikan contoh sederhana dari signal
berfungsi di bawah dengan komentar.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h> // our new library
volatile sig_atomic_t flag = 0;
void my_function(int sig){ // can be called asynchronously
flag = 1; // set flag
}
int main(){
// Register signals
signal(SIGINT, my_function);
// ^ ^
// Which-Signal |-- which user defined function registered
while(1)
if(flag){ // my action when signal set it 1
printf("\n Signal caught!\n");
printf("\n default action it not termination!\n");
flag = 0;
}
return 0;
}
Catatan:Anda sebaiknya hanya memanggil fungsi aman/resmi di penangan sinyal. Misalnya, hindari memanggil printf di penangan sinyal.
Anda dapat mengkompilasi kode ini dengan gcc dan menjalankannya dari shell. Ada loop tak terbatas dalam kode dan akan berjalan sampai Anda mengirim SIGINT
sinyal dengan menekan Ctr + C .
Anda dapat menggunakan makro sinyal.
Berikut adalah contoh cara menghadapinya:
#include <signal.h>
#include <stdio.h>
void sigint(int a)
{
printf("^C caught\n");
}
int main()
{
signal(SIGINT, sigint);
for (;;) {}
}
Keluaran sampel:
Ethans-MacBook-Pro:~ phyrrus9$ ./a.out
^C^C caught
^C^C caught
^C^C caught
^C^C caught
^C^C caught
Mengetik Ctrl C biasanya menyebabkan shell mengirim SIGINT
ke program Anda. Tambahkan pengendali untuk sinyal tersebut (melalui signal(2)
atau sigaction(2)
), dan Anda dapat melakukan apa yang Anda suka saat Ctrl C ditekan.
Bergantian, jika Anda hanya ingin melakukan pembersihan sebelum program Anda keluar, atur handler keluar melalui atexit(3)
mungkin lebih tepat.