вызовите функцию, когда программа будет закончена с ctrl c

Я считаю, что программа хорошо сформирована. Я недавно столкнулся с подобной проблемой. У GCC, похоже, есть проблемы, когда ему нужно определить тип возвращаемого значения placehoder в процессе определения аргументов массива. Например, явное указание типа возврата в виде void заставит GCC принять ваш код.

В конечном итоге, обходной путь заключается в разделении деклараций.

auto *p = f<5>;
std::array{p};
5
задан Douglas Leeder 15 December 2008 в 17:39
поделиться

5 ответов

signal() может быть опасным на некоторых Ose и удерживается от использования на Linux в пользу sigaction(). "сигнал по сравнению с 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;
}
8
ответ дан 18 December 2019 в 08:32
поделиться

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

#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
7
ответ дан 18 December 2019 в 08:32
поделиться

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

0
ответ дан 18 December 2019 в 08:32
поделиться

Необходимо поймать SIGINT. Что-то вроде этого:

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

загрузки больше детали здесь

4
ответ дан 18 December 2019 в 08:32
поделиться

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

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

0
ответ дан 18 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: