Я считаю, что программа хорошо сформирована. Я недавно столкнулся с подобной проблемой. У GCC, похоже, есть проблемы, когда ему нужно определить тип возвращаемого значения placehoder в процессе определения аргументов массива. Например, явное указание типа возврата в виде void
заставит GCC принять ваш код.
В конечном итоге, обходной путь заключается в разделении деклараций.
auto *p = f<5>;
std::array{p};
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;
}
Для полного рабочего примера можно попробовать следующий код:
#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
Короткий ответ: изучите функцию сигнала, конкретно ловя SIGINT. Вы пишете функцию обратного вызова и передаете ее системе через функцию сигнала, затем когда тот конкретный сигнал происходит, системные вызовы Ваша функция обратного вызова. Можно закрыть файлы и сделать то, что другой материал очистки Вы хотите там.
Необходимо поймать SIGINT. Что-то вроде этого:
void sigint_handler(int sig)
{
[do some cleanup]
signal(SIGINT, SIG_DFL);
kill(getpid(), SIGINT);
}
Отметьте людям, которые могли бы наткнуться на этот вопрос, ища ответ в Windows вместо этого:
Используйте SetConsoleCtrlHandler
Вызов API для установки пользовательского обработчика и часов для CTRL_C_EVENT
, CTRL_BREAK_EVENT
или CTRL_CLOSE_EVENT
.