当进程在后台启动时,fd0 设置为什么?

What is fd0 set to, when process is started in background?

通常 fd0 == stdin。但是当进程在后台启动并且 fd0 再次由终端拥有时,它在后台进程中设置了什么?后台进程如何接受输入? (如果没有重定向)

FD 0 被定义为标准输入,无论它连接到什么。

无论进程是 运行 在前台还是后台,它都会从其父进程继承所有描述符。所以当没有重定向时,FD 0 将连接到终端。

但是,终端设备有一个前台进程组,并且只有该组中的进程才可以读取输入。实现作业控制的shell把每一个作业放到不同的进程组中,将终端的前台进程组设置为前台进程所在的组。这样做的结果是,如果后台进程尝试从终端读取数据,它们将被停止。

您还可以使用 stty tostop 来停止试图写入终端的后台进程。如果您不希望后台进程的输出干扰您在前台执行的操作,这会很有用。