c - 如何捕获SIGINT并在子进程中忽略它?

标签 c signals systems-programming

我有一个从命令行参数运行程序的主程序。命令行程序被 fork 并在子进程中运行。当发送 SIGINT 时,我想捕获它并要求用户确认他/她想要退出。如果是,则父进程和子进程都结束,否则子进程继续运行。 我的问题是,当用户拒绝时,我无法让 child 开始重新运行。 我已经尝试过 SIGSTOP 和 SIGCONT 但这些实际上只会导致进程停止。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <errno.h>

extern char **environ;
void sigint_handler(int sig);
void sigint_chldhandler(int sig);

int main( int argc, char** argv)
{
    int pid;
    signal(SIGINT,sigint_handler);


    if((pid=fork())==0)
    {
            printf("%d\n",pid);

            execve(argv[1],argv,environ);
    }


    int status;
    waitpid(pid,&status,0);
}
void sigint_handler(int sig)
{
    printf("Do you want to quit?Yes/No:\n");
    char buf[4];
    fgets(buf, sizeof(char)*4, stdin);

    printf("child pid:%d\n",getpid());
    printf("parent pid:%d\n",getppid());

    if(strcmp(buf,"Yes")==0)
    {
            kill(-getpid(),SIGKILL);
            printf("Exiting!\n");
            exit(0);
    }

}

最佳答案

除非您操纵子级的信号处理,否则无论父级发生什么情况,发送信号时都会被中断终止。因此,你需要变得更加成熟。我认为您需要以下内容:

  1. 父进程设置其 SIGINT 信号处理程序。
  2. 父级 fork 。
  3. 子进程将其 SIGINT 处理设置为 SIG_IGN。
  4. 子进程执行指定的命令。
  5. 父进程等待 SIGINT 到达,可能是在运行 waitpid() 时。
  6. 当它到达时,它会向子级发送 SIGSTOP。
  7. 它提出问题并获得响应。
  8. 如果响应继续,则它向子级发送 SIGCONT 并返回到等待模式。
  9. 如果响应要停止,则它首先向子进程发送 SIGCONT,然后发送 SIGTERM(或除 SIGINT 之外的其他信号)以终止它。 (使用 SIGKILL 是不明智的;应该给 child 一个机会退出以响应 SIGTERM 或 SIGHUP。如果 child 不认真对待死亡威胁,那么你可以向它发送 SIGKILL。)
  10. 当父进程确定子进程已退出时,它可以依次退出。

请注意,如果子进程正在运行类似 vim 的内容,这会极大地改变终端设置,那么向其发送 SIGKILL 将使终端处于锁定状态。它正在巧妙地将其恢复到理智状态;最好让程序有机会自行重置终端设置。

关于c - 如何捕获SIGINT并在子进程中忽略它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22030550/

相关文章:

assembly - 文字 VS 立即操作数

c - matlab 中 mex 函数的安全、快速 CFLAGS

c++ - 如何在 C(首选)/C++ 中按顺序将一组一维数组传递给函数

c++ - 在信号处理程序中使用 SIGRTMIN 和 SIGRTMAX 是否安全?

c - 为什么缓冲区位于 main() 本地,然后无法显式关闭流是一个错误?

c - 如何仅在 C 中列出一级目录?

c - Hashtable的有效实现,具有可识别缓存的本地性(对本地性敏感的哈希表)

clang-分析 : how to avoid "garbage value" warning?

java - 如何在JAVA中向进程发送ctrl+c信号

python - 可以是 "C++ application signal python script on completion"吗?