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;
}
这个问题本来可以通过 运行 一个简单的思想实验进行微不足道的调试。
我不明白为什么当我 运行 这段代码然后使用 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;
}
这个问题本来可以通过 运行 一个简单的思想实验进行微不足道的调试。