2015-10-31 3 views
0

Я не понимаю, почему, когда я запускаю этот код, а затем использую прерывание control + C, программа немедленно закрывается, но файл журнала показывает, что «программа прошла успешно». Как я могу напечатать правильное сообщение?Обработка сигналов в C: программа продолжает выполнение даже после прерывания

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <signal.h> 

static volatile int globalFlag = 0; 

void handler(); 

int main() 
{ 
    FILE* log; 
    log = fopen("log.txt", "a"); 
    signal(SIGINT, handler); 
    while(globalFlag == 0){ 

     sleep(20); 
     fprintf(log, "program ran successfully\n"); 
     fclose(log); 

     return 0; 
    } 
    fprintf(log, "program shut by signal\n"); 
    fclose(log); 
    return -1; 

} 

void handler() 
{ 

    globalFlag = 1; 

} 

ответ

1

Возможно, вы хотели, чтобы оператор сна находился вне цикла while.

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <signal.h> 

static volatile int globalFlag = 0; 

void handler() { 
    globalFlag = 1; 
} 

int main() { 
    FILE* log; 
    log = fopen("log.txt", "a"); 
    signal(SIGINT, handler); 
    sleep(20); 

    if (globalFlag == 0){ 
     fprintf(log, "program ran successfully\n"); 
     fclose(log); 
     return 0; 
    } else { 
     fprintf(log, "program shut by signal\n"); 
     fclose(log); 
     return -1; 
    } 
} 
+0

Спасибо, это работает. Кажется, я неправильно понял, что делает контроль + C. – Mari

1

Я довольно смущен: «Кажется, я неправильно понял, что такое контроль + C». так что позвольте мне заняться здесь больше.

#include <stdio.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <signal.h> 

static volatile int globalFlag = 0; 

Тип должен быть sig_atomic_t. Переменная уже 0. Плохое имя.

void handler(); 

Обработчики должны принимать int. Плохое имя. Может быть статическим.

int main() 

Должно быть «пусто».

{ 
    FILE* log; 
    log = fopen("log.txt", "a"); 

Отсутствует проверка ошибок.

signal(SIGINT, handler); 

Так вот установлен обработчик ...

while(globalFlag == 0){ 

... флаг сразу проверил ...

sleep(20); 
    fprintf(log, "program ran successfully\n"); 
    fclose(log); 

... и программа завершает работу, потому что вы не удалось достаточно быстро отправить сигнал.

 return 0; 
    } 
    fprintf(log, "program shut by signal\n"); 
    fclose(log); 
    return -1; 

} 

Вопрос был бы тривиально отлажен, пропустив простой мысленный эксперимент.

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