我正在为一个班级编写一个shell程序,我遇到了一个我不完全理解的问题。
我必须实施后台工作。 阻止后台作业从终端读取的问题。 我说过的每一个资源都没有调用wait(),但这对我造成了错误。 现在我有一个小程序,只需读取输入并重新打印直到eof。 发生的事情是在我在某些时候fork和exec输入其他命令后开始打印0的
0 0 0 。 。
我遇到了一些建议的解决方案,例如更改流程组 UNIX System call to register a background process
这个解决方案并没有阻止我遇到的问题。从我的理解,这个程序应该得到SIGTTIN并停止(我可能误解了这个)。不幸的是,在后台进程上搜索任何内容都会带来大多数与shell脚本有关的页面而不是实现。
我开始编写一个信号处理程序来捕获SIGTTIN但是我不知道该做什么。我以为我会使用kill()暂停程序,但是如何让程序的pid尝试读取。
编辑:我应该提到这个问题是因为我的测试程序以int形式读取输入。但我需要它来阻止它读取。
编辑:我的简单测试程序是
cin >> temp;
do{
cout << temp << endl;
cin >> temp;
}while(!cin.eof());
当它分叉时,
if(PID == 0){
/*code for checking if IO is redirected*/
execvpe(args[0], args, curState.getEnv());
cout << args[0] << " not a command" << endl;
exit(1);
}
然后父母检查是否应该等待
if(jobWait()){
waitpid(PID, &status, 0);
}
答案 0 :(得分:2)
解决了我的问题,如果我正确使用setpgid(int,int),那么后台应用程序在尝试读取输入时会停止。然后,我可以使用tcsetpgrp(int,int)从父进程控制终端,并使用waitpid(int,&amp; int,int)等待子进程,并且只要我处理SIGCHLD,所以父进程不会在子项退出后停止,然后Parent可以使用tcsetpgrp(int,int)
恢复控制