所以我试图在subprocess中为SIGTSTP信号实现一个信号处理程序。
基本上我试图达到的是这样的:
我运行它使用命令:./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()
来查看子进程是否退出或停止,并相应地执行(这涉及到实际上终止子进程)。