我编写了一个从内部调用系统命令的程序:
#include <stdlib.h>
int main(void)
{
while(1)
{
system("ls 2>&1 1>/dev/null"); // comment this line out to enable ctrl+break
}
return 0;
}
但是,当它运行时,CTRL + C和CTRL + BREAK不再起作用,并且似乎被忽略了。
我正在尝试编写一个程序,该程序在涉及shell的后台执行一些操作,但是我也希望能够在用户想要中断时退出该程序。
有没有办法让它按照我想要的方式工作?我应该更改体系结构以执行某种fork/exec吗?
最佳答案
从POSIX specification for system()
:
因此,为了正确响应信号,您需要检查system()
的返回值。
waitpid()
的文档引用 wait()
的文档,该文档指示您使用以下宏来找出退出进程的原因:
这是一个示例,说明您如何使用此信息,而不必进行单独的处理。请注意,您实际上不会在父进程中接收到信号,但是您可以确定发送到子进程的信号:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
while(1)
{
int result = system("ls 2>&1 1>/dev/null");
if (WIFEXITED(result)) {
printf("Exited normally with status %d\n", WEXITSTATUS(result));
} else if (WIFSIGNALED(result)) {
printf("Exited with signal %d\n", WTERMSIG(result));
exit(1);
} else {
printf("Not sure how we exited.\n");
}
}
return 0;
}
如果运行它,您将获得:
$ ./sys
正常退出,状态为0
正常退出,状态为0
正常退出,状态为0
正常退出,状态为0
正常退出,状态为0
正常退出,状态为0
^以信号2终止