所以我试图在子进程中为SIGTSTP信号实现信号处理程序。
基本上我想要实现的是:
我使用命令运行它:./ 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
答案 0 :(得分:4)
您有两个流程:
父母忽略了信号,
设置处理程序的子进程然后执行另一个进程 - 这将从内存中清除信号处理程序的代码(执行的程序将被加载代替调用进程),因此也将清除信号设置也是如此。因此,永远不会调用您的信号处理函数。 Is it possible to signal handler to survive after “exec”?
您可以采取哪些措施来实现目标?
家长应忽略该信号,
孩子应该保留默认信号处理(停止它),
父母应使用waitpid()
查看子进程是退出还是已停止,并采取相应措施(这实际上是杀死已停止的子进程)。