GNU/Linux >> Belajar Linux >  >> Linux

memanggil fungsi ketika program selesai dengan ctrl c

signal() bisa berbahaya pada beberapa OS dan tidak digunakan lagi di Linux karena mendukung sigaction() . "sinyal versus sigaksi"

Berikut adalah contoh yang saya temui baru-baru ini ("Ketuk sinyal interupsi") dan dimodifikasi saat saya bermain-main dengannya.

#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<string.h>

struct sigaction old_action;

void sigint_handler(int sig_no)
{
    printf("CTRL-C pressed\n");
    sigaction(SIGINT, &old_action, NULL);
    kill(0, SIGINT);
}

int main()
{

    struct sigaction action;
    memset(&action, 0, sizeof(action));
    action.sa_handler = &sigint_handler;
    sigaction(SIGINT, &action, &old_action);

    pause();

    return 0;
}

Untuk contoh yang berfungsi penuh, Anda dapat mencoba kode berikut:

#include <signal.h>
#include <stdio.h>
#include <stdbool.h>

volatile bool STOP = false;
void sigint_handler(int sig);

int main() {
    signal(SIGINT, sigint_handler);
    while(true) {
        if (STOP) {
            break;
        }
    }
    return 0;
}

void sigint_handler(int sig) {
    printf("\nCTRL-C detected\n");
    STOP = true;
}

Contoh jalankan:

[[email protected]]$ ./a.out 
^C
CTRL-C detected

Anda harus menangkap SIGINT. Sesuatu seperti ini:

void sigint_handler(int sig)
{
    [do some cleanup]
    signal(SIGINT, SIG_DFL);
    kill(getpid(), SIGINT);
}

memuat detail lebih lanjut di sini


Linux
  1. Menjalankan Jalur yang Dapat Dieksekusi Dengan Nama Yang Sama Dengan Fungsi yang Ada?

  2. Bagaimana Membuat Program Apa Pun Bekerja Dengan Perintah Tee?

  3. Setara dengan ctrl c dalam perintah untuk membatalkan program

  1. Ketika assert() gagal, apa kode keluar programnya?

  2. Kapan harus memeriksa EINTR dan mengulangi pemanggilan fungsi?

  3. Bagaimana cara menganalisis file dump inti program dengan GDB ketika memiliki parameter baris perintah?

  1. Batalkan panggilan sistem dengan ptrace()

  2. Bagaimana cara menambahkan fungsi polling ke kode modul kernel?

  3. Skrip Nohup untuk Python tidak berfungsi saat berjalan di latar belakang dengan &