【问题标题】:SIGTSTP signal handler for child process子进程的 SIGTSTP 信号处理程序
【发布时间】:2014-12-09 21:13:39
【问题描述】:

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

基本上我想要实现的是:

  1. 启动子进程
  2. 让父进程等待子进程
  3. 在子进程上调用睡眠 x 秒。
  4. 在睡眠完成执行之前,我想发送一个 Ctrl+Z 信号。 这个信号应该停止子进程,但恢复父进程 过程。然后父进程应该知道 停止进程。

我使用以下命令运行它:./testsig 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

【问题讨论】:

    标签: c linux unix process signals


    【解决方案1】:

    你有两个进程:

    • 忽略信号的父级,

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

    你可以做些什么来实现你的目标?

    • 父母应该忽略这个信号,

    • 孩子应该离开默认的信号处理(停止它),

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

    【讨论】:

    • 哦,我明白了。那么有没有不同的方法来完成我想做的事情?
    • 另外,如果他们都没有执行信号处理程序 - 是什么阻止了父进程在子进程完成执行时恢复?
    • 我不知道,在我的电脑上,它确实在wait() 返回后恢复运行。还有两个错误:last_proc_stopped 不会被设置,所以我得到一个 0,而你复制 argv 字符串的魔法很糟糕,你不应该真正写入任何这些字符串。
    • 哈哈我意识到了。这只是理解信号处理程序的快速代码。我的意思是,当您在孩子执行睡眠时按 ctrl+z 时,是什么阻止了父母恢复?
    • 尝试使用strace -f -v运行它。
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 2012-09-23
    • 1970-01-01
    • 2016-03-07
    相关资源
    最近更新 更多