就像问题所说的那样,我想根据某些条件不同地处理SIGTSTP信号。我的最终代码不会那么简单,但我试图让它首先工作:
static void stphandler(int signo) {
sigset_t mask;
//Unblock SIGTSTP
sigemptyset( & mask);
sigaddset( & mask, SIGTSTP);
sigprocmask(SIG_UNBLOCK, & mask, NULL);
if (getpid() != ultimateParent) {
printf("Not the parent process\n");
exit(0);
}
else {
printf("This is the parent process");
}
}
父进程初始化的代码:
ultimateParent=getpid();
sa_stp.sa_handler = stphandler;
sigemptyset(&sa_stp.sa_mask);
sa_stp.sa_flags = SA_RESTART;
sigaction(SIGTSTP, &sa_stp, NULL);
创建子代码:
//leave args blank. Keep wc waiting for an input
execErr=execvp("wc",args);
if(errno==EACCES)
{
fprintf(stderr,"%s: Permission Denied.\n",command);
}
else
{
fprintf(stderr,"%s: Command not found.\n",command);
}
exit(0);
这是我做的以及我得到的输出:
在家长中:
当父进程运行并按CTRL + Z时,输出为: ^ Z
当我按下返回键时,printf命令在下一行执行:
“这是父流程”
问题:为什么它等待我按回车键继续?
在孩子中
它只是在生成信号时打印^ Z次数,使用返回键转到下一行 - 但忽略ctrl + D(这通常会导致wc读取EOF并完成执行)或任何其他信号那个问题,除了SIGQUIT。
问题:为什么在ctrl + z之后忽略了更多信号?有没有办法简单地让孩子退出?
我觉得我遗漏了一些关于信号和信号处理程序的重要信息。任何帮助,文章或其他参考资料都表示赞赏。