如何判断孩子是否要求stdin?我怎么告诉它阻止它?

Zig*_*ggy 6 c fork exec

在bash中,当我运行一个类似命令wc &或者cat &想立即获得标准的命令时,它会立即返回

[1] +停止了猫

这是如何完成的?如何停止我开始使用exec的程序,以及如何知道首先停止这些程序?有没有办法告诉这些程序是否需要标准输入?

谢谢!

PS也,+约是什么?我一直在想,但谷歌真的很难......

caf*_*caf 1

手册setpgid()页解释了它是如何工作的:

会话可以有一个控制终端。任何时候,会话中的一个(且仅有一个)进程组可以是终端的前台进程组;其余进程组在后台运行。如果从终端生成信号(例如,键入中断键以生成SIGINT),则该信号将发送到前台进程组。(请termios(3)参阅 参考资料 中有关生成信号的字符的描述。)只有前台进程组可以read(2)来自终端;如果后台进程组尝试read(2)从终端进行操作,则会向该组发送一个 SIGTSTP信号,将其挂起。tcgetpgrp(3)和 函数tcsetpgrp(3)用于获取/设置控制终端的前台进程组。

所以你想做的是这样的:

  1. 当创建新的管道时,调用setpgid()将管道的所有成员放入一个新的进程组中(以管道中第一个进程的PID作为PGID)。

  2. 用于tcsetpgrp()管理哪个进程组位于前台 - 如果您使用 来将管道置于后台&,则应使 shell 自己的进程组再次成为前台进程组。

  3. 使用waitpid()WNOHANG标志WUNTRACED调用来检查子进程的状态 - 这将在它们被 停止时通知您SIGTSTP,这将允许您像 bash 一样打印消息。