用于subprocess的SIGTSTP信号处理程序

所以我试图在subprocess中为SIGTSTP信号实现一个​​信号处理程序。

基本上我试图达到的是这样的:

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

我运行它使用命令:./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,控制返回到父母按预期。

我究竟做错了什么?

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

在用SIGTSTP挂起subprocess后,shell没有响应

你有两个过程:

  • 忽略信号的父母,

  • 设置处理程序的子程序会执行另一个进程 – 这将清除内存中信号处理程序的代码(执行的程序将在调用进程中加载​​),因此也将清除信号设置。 所以,你的信号处理函数将永远不会被调用。 “执行”之后有没有可能发信号通知处理程序?

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

  • 家长应该忽略信号,

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

  • 父母应该使用waitpid()来查看子进程是否退出或停止,并相应地执行(这涉及到实际上终止子进程)。