Dec 02

[Tutorial] Signal Handling pada C

Pernahkan anda membuat program dan kemudian ketika ada user menekan Ctrl+C atau Alt+F4, anda ingin program yang dibuat melakukan hal lain selain mengakhiri hidupnya? Atau paling tidak, sebelum mati, program anda bisa membebaskan memori-memori yang dibutuhkan, menutup file-file yang dibuka, atau lainnya. Hal itu bisa kita lakukan jika di dalam program ada penanganan sinyal (signal handling).

Pada dasarnya, ketika user menekan kombinasi tombol tertentu (dalam hal ini Ctrl+C)/terjadi suatu event tertentu, maka sistem operasi akan mengirimkan sebuah sinyal ke aplikasi yang berjalan. Dan setiap aplikasi yang berjalan juga sudah memiliki default signal handlingnya sendiri, sebagai contoh aplikasi akan mengakhiri hidupnya ketika Ctrl+C ditekan. Di post ini, kita akan belajar bagaimana caranya mengubah default signal handling tersebut, sehingga aplikasi bisa berjalan dengan lebih baik sesuai keinginan pengguna.

Ketika Ctrl+C ditekan, sistem operasi (Linux) akan mengirimkan sinyal SIGINT (SIGnal INTerrupt) ke aplikasi yang berjalan. Yang perlu kita lakukan di sini adalah mengubah sedikit proses signal handling. Cara ini dapat berlaku untuk jenis sinyal apapun, tidak harus sinyal SIGINT. Berikut ini adalah langkah-langkah menambahkan signal handling pada aplikasi anda :

  1. Buat sebuah fungsi handler dahulu dengan return value void dan sebuah parameter integer.
  2. Isi fungsi tersebut dengan baris yang diinginkan. Fungsi ini akan dipanggil setiap kali sinyal yang diincar masuk ke aplikasi kita, sehingga perlu ada seleksi untuk mengetahui sinyal apakah yang datang. Karena perlakuan tiap sinyal kemungkinan besar berbeda.
    void sighandler(int sig)
    {
    if(sig == SIGINT)
    {
    printf("Terminating program ...");
    }
    return ;
    }
  3. Di awal program (awal fungsi main), kita perlu mendaftarkan fungsi handler yang sudah dibuat dengan cara mendaftarkannya pada sebuah struct sigaction.
    struct sigaction action;
    action.sa_handler = sighandler;
    action.sa_flags = 0;
  4. Kemudian panggil fungsi sigaction() untuk mendaftarkan handler dengan sinyal yang ingin ditangkap
    sigaction(SIGINT,&action,NULL);
  5. Ketika program berjalan dan user menekan tombol Ctrl+C atau mengirim perintah kill SIGINT PID, maka aplikasi kita akan mengeluarkan pesan “terminating program”. Proses ini dapat diganti sesuai kebutuhan.
Be Sociable, Share!

0
comments

Reply

[+] kaskus emoticons nartzco