вызывать функцию, когда программа заканчивается ctrl c - PullRequest
5 голосов
/ 15 декабря 2008

Я работаю в среде Linux, и у меня есть программа на C ++, что я хочу, чтобы, когда я отменял программу с помощью ctrl + c, я хотел бы, чтобы программа выполняла функцию, чтобы закрыть некоторые файлы и напечатать некоторые sutff, Есть какой-либо способ сделать это?. Спасибо.

Ответы [ 5 ]

8 голосов
/ 18 декабря 2008

signal() может быть опасно в некоторых операционных системах и в Linux заменяется на sigaction(). «сигнал против сигмации»

Вот пример, который я недавно наткнулся ( "Нажмите на сигнал прерывания" ) и изменил его, играя с ним.

#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;
}
7 голосов
/ 15 декабря 2008

Для полного рабочего примера вы можете попробовать следующий код:

#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;
}

Пример выполнения:

[user@host]$ ./a.out 
^C
CTRL-C detected
4 голосов
/ 15 декабря 2008

Вы должны поймать SIGINT. Примерно так:

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

загружает больше деталей здесь

0 голосов
/ 15 декабря 2008

Примечание для людей, которые могут наткнуться на этот вопрос, ища ответ в Windows вместо:

Используйте вызов API SetConsoleCtrlHandler для установки пользовательского обработчика и отслеживайте CTRL_C_EVENT, CTRL_BREAK_EVENT или CTRL_CLOSE_EVENT.

0 голосов
/ 15 декабря 2008

Краткий ответ: посмотрите на функцию сигнала, особенно ловя SIGINT. Вы пишете функцию обратного вызова и передаете ее в систему через функцию сигнала, а затем, когда происходит этот конкретный сигнал, система вызывает вашу функцию обратного вызова. Вы можете закрывать файлы и делать там все, что захотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...