我编写了一个从内部调用系统命令的程序:

#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终止

10-07 17:15