Я работаю над следующим кодом. Программа должна иметь возможность обрабатывать SIGINT с помощью sigaction. Пока это почти сделано, но я столкнулся с двумя проблемами.
Первая проблема - программа должна печатать «Выключение» и выйти со статусом 1, если он получает 3 сигнала в течение 3 секунд.
Вторая проблема это я использую gettimeofday и STRUCT для формата: первый формат получить время в секундах относительно к времени прихода сигналов, но я не смог здесь. Когда я попробовал это, я застрял в бесконечной петле, даже думал, что нажал ctrl + C 3 раза в течение 3 секунд. Кроме того, полученные секунды - довольно большие числа.
Надеюсь, кто-то может помочь мне решить эти две проблемы. Вот кодОбработчик сигналов для SIGINT
int timeBegin = 0;
void sig_handler(int signo) {
(void) signo;
struct timeval t;
gettimeofday(&t, NULL);
int timeEnd = t.tv_sec + t.tv_usec;
printf("Received Signal\n");
int result = timeEnd - timeBegin;
if(check if under 3 seconds) { // How to deal with these two problems?
printf("Shutting down\n");
exit(1);
}
timeBegin = timeEnd // EDIT: setting the time new, each time when a signal arrives. Is that somehow helpful?
}
int main() {
struct sigaction act;
act.sa_handler = &sig_handler;
sigaction(SIGINT, &act, NULL);
for(;;) {
sleep(1);
}
return 0;
}
Вы имеете в виду как * uint64_t timeEnd = t.tv_sec + t.tv_usec * и * uint64_t timeBegin = 0 *? Как преобразовать его в микросекунды и почему? Для второй проблемы я просто попробовал следующее: if (result <3), и у меня был счетчик, но, как я сказал выше, это не сработало. – tumbler
Вам нужно преобразовать, потому что секунды и микросекунды разные единицы ... (вы знаете, что означает «микро», верно?) – vanza
Хорошо, я должен использовать коэффициент ** 1000000 **. Но все же, как я мог решить другую проблему с появлением нескольких сигналов? Не могли бы вы дать мне хотя бы несколько советов? – tumbler