用于子进程的SIGTSTP信号处理程序

时间:2014-10-14 22:41:20

标签: c linux unix process signals

所以我试图在子进程中为SIGTSTP信号实现信号处理程序。

基本上我想要实现的是:

  1. 启动子流程
  2. 让父级等待子进程
  3. 在子进程上调用Sleep,持续x秒。
  4. 在睡眠完成之前,我想发送一个Ctrl + Z信号。 此信号应该停止子进程,但是恢复父进程 处理。然后父进程应该知道进程id 停止了进程。
  5. 我使用命令运行它:./ teststs sleep 10

    到目前为止,这是我的代码:

    #include<stdlib.h>
    #include<stdio.h>
    #include<signal.h>
    #include<string.h>
    
    
    
    volatile sig_atomic_t last_proc_stopped;
    volatile sig_atomic_t parent_proc_id;
    
     void handle_stp(int signum)
      {
        if(getpid()==parent_proc_id)
        {
            kill(parent_proc_id,SIGCONT);
            signal(SIGTSTP,handle_stp);
        }
        else
        {
            last_proc_stopped=getpid();
          kill(parent_proc_id,SIGCONT);
        }   
      }
    
    
    
      void main(int argc, char *argv[])
      {
    
        int childid=0,status;
    
        signal(SIGTSTP,SIG_IGN);
    
        parent_proc_id=getpid();
    
    
        childid=fork();
    
        if(childid>=0)
        {
    
          if(childid==0)//child
          {
    
    
            signal(SIGTSTP,handle_stp);
            strcpy(argv[0],argv[1]);
            strcpy(argv[1],argv[2]);
            argv[2]=NULL;
            printf("Passing %s %s %s\n",argv[0],argv[1],argv[2]);
            execvp(argv[0],argv);
          }
    
          else
          {
            wait(&status);
    
            printf("Last Proc Stopped:%d\n",last_proc_stopped);
    
          }
        }
    
        else
        {
          printf("fork failed\n");
        }
      }
    

    目前,似乎ctrl + Z有某种效果(但绝对不是我想要的那种!)

    当我在执行睡眠的孩子中间点击ctrl + Z时,光标会继续闪烁(在我的情况下为10秒),但控件不会到达父进程。

    不按ctrl + Z,控制按预期返回父级。

    我做错了什么?

    我也看到了这个答案,但我真的无法理解它:

    After suspending child process with SIGTSTP, shell not responding

1 个答案:

答案 0 :(得分:4)

您有两个流程:

  • 父母忽略了信号,

  • 设置处理程序的子进程然后执行另一个进程 - 这将从内存中清除信号处理程序的代码(执行的程序将被加载代替调用进程),因此也将清除信号设置也是如此。因此,永远不会调用您的信号处理函数。 Is it possible to signal handler to survive after “exec”?

您可以采取哪些措施来实现目标?

  • 家长应忽略该信号,

  • 孩子应该保留默认信号处理(停止它),

  • 父母应使用waitpid()查看子进程是退出还是已停止,并采取相应措施(这实际上是杀死已停止的子进程)。