GNU/Linux >> Belajar Linux >  >> Linux

Ctrl + C penanganan acara interupsi di Linux

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

  1. sinyal(int signum, penangan sighandler_t);
  2. 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.


Linux
  1. UNIX / Linux:3 Cara Mengirim Sinyal ke Proses

  2. Sinyal Linux – Contoh Program C untuk Menangkap Sinyal (SIGINT, SIGKILL, SIGSTOP, dll.)

  3. Dasar-Dasar Sinyal Linux – Bagian I

  1. Penanganan sinyal UNIX/Linux:SIGEV_THREAD

  2. acara koneksi/putuskan koneksi usb linux

  3. Kekuatan Sinyal Bluetooth LE Linux

  1. ctrl + r di baris perintah terminal linux / ubuntu

  2. Bagaimana Interupsi ditangani di Linux?

  3. Pintasan keyboard pengelola tugas di Linux?