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

Signal handling in C: program continues executing even after interruption

我不明白为什么当我 运行 这段代码然后使用 control+C 中断程序立即关闭但日志文件显示 "program ran successfully"。我怎样才能让它打印出正确的消息?

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

}

您可能希望 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; 
    } 
} 

我对'It seems I had misunderstood what control+C does.'感到很困惑,所以让我在这里多看一会儿。

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

应该是'void'.

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

}

这个问题本来可以通过 运行 一个简单的思想实验进行微不足道的调试。