C:中的信号处理程序即使在中断后也会继续执行

时间:2015-10-31 15:17:31

标签: c signal-handling

我不明白为什么当我运行此代码然后使用控制+ C中断时程序立即关闭但日志文件显示"程序成功运行"。如何让它打印出正确的信息?

SELECT artist_name FROM artist
JOIN album ON artist.artist_id = album.artist_id
WHERE EXISTS (SELECT album_id FROM album)

2 个答案:

答案 0 :(得分:1)

您可能希望sleep语句在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; 
    } 
} 

答案 1 :(得分:1)

我很困惑&#39;我似乎误解了控制+ C的作用。&#39;所以让我在这里待一会儿。

#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()

应该是&#39; void&#39;。

{
    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;

}

通过运行一个简单的思想实验,可以轻松调试该问题。