这是2个版本的程序完整代码
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
int main(){
pid_t pid = fork();
if (pid){
setpgid(pid, pid);
tcsetpgrp(STDIN_FILENO, pid);
int status;
waitpid(pid, &status, WUNTRACED);
puts("waitdone");
//in second version: uncomment the next line
//tcsetpgrp(STDIN_FILENO, getpgrp());
while(1);
}else{
//child
while(1);
}
return 0;
}
我对该程序的2个版本有2个问题
运行第一个版本程序后,按ctrl-c
,打印出waitdone
。以下ctrl-c
不会中断主进程 - &gt;程序卡住,再也无法被ctrl-c
打破。为什么shell不会忽略父进程并在父进程不再处于前台时在第一个ctrl-c
之后立即返回提示?
在第二个版本(第二个tcsetpgrp
取消注释)中,在第一个ctrl-c
之后,父进程似乎被sigtstp
停止了。
Shell打印出'./a.out' has stopped
并返回提示。
之后,可以使用fg
恢复主程序。这一次,ctrl-c
会停止父进程的while(1);
。为什么在第二个版本中,父进程的tcsetpgrp
不会阻止shell返回提示符?
请帮忙。 非常感谢提前