在bash中,当我运行一个类似命令wc &或者cat &想立即获得标准的命令时,它会立即返回
[1] +停止了猫
这是如何完成的?如何停止我开始使用exec的程序,以及如何知道首先停止这些程序?有没有办法告诉这些程序是否需要标准输入?
谢谢!
PS也,+约是什么?我一直在想,但谷歌真的很难......
手册setpgid()页解释了它是如何工作的:
会话可以有一个控制终端。任何时候,会话中的一个(且仅有一个)进程组可以是终端的前台进程组;其余进程组在后台运行。如果从终端生成信号(例如,键入中断键以生成
SIGINT),则该信号将发送到前台进程组。(请termios(3)参阅 参考资料 中有关生成信号的字符的描述。)只有前台进程组可以read(2)来自终端;如果后台进程组尝试read(2)从终端进行操作,则会向该组发送一个SIGTSTP信号,将其挂起。tcgetpgrp(3)和 函数tcsetpgrp(3)用于获取/设置控制终端的前台进程组。
所以你想做的是这样的:
当创建新的管道时,调用setpgid()将管道的所有成员放入一个新的进程组中(以管道中第一个进程的PID作为PGID)。
用于tcsetpgrp()管理哪个进程组位于前台 - 如果您使用 来将管道置于后台&,则应使 shell 自己的进程组再次成为前台进程组。
使用waitpid()和WNOHANG标志WUNTRACED调用来检查子进程的状态 - 这将在它们被 停止时通知您SIGTSTP,这将允许您像 bash 一样打印消息。
| 归档时间: | 
 | 
| 查看次数: | 694 次 | 
| 最近记录: |