2013-12-04 3 views
1

Я работаю над следующим кодом. Программа должна иметь возможность обрабатывать 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; 
} 

ответ

1
int timeEnd = t.tv_sec + t.tv_usec; 

Это не будет работать, потому что tv_sec и tv_usec разные порядки. Если вы хотите получить микросекундную точность, вам нужно будет сохранить значение в более крупном типе (например, int64_t) и преобразовать секунды в микросекунды.

if(check if under 3 seconds) { // How to deal with these two problems? 

Ну, что вы пробовали? У вас есть несколько сигналов, поступающих в разное время, вам нужно знать о них, чтобы знать, все ли они получены в течение 3 секунд друг от друга.

+0

Вы имеете в виду как * uint64_t timeEnd = t.tv_sec + t.tv_usec * и * uint64_t timeBegin = 0 *? Как преобразовать его в микросекунды и почему? Для второй проблемы я просто попробовал следующее: if (result <3), и у меня был счетчик, но, как я сказал выше, это не сработало. – tumbler

+0

Вам нужно преобразовать, потому что секунды и микросекунды разные единицы ... (вы знаете, что означает «микро», верно?) – vanza

+0

Хорошо, я должен использовать коэффициент ** 1000000 **. Но все же, как я мог решить другую проблему с появлением нескольких сигналов? Не могли бы вы дать мне хотя бы несколько советов? – tumbler

Смежные вопросы