子进程的默认 stdin 和 stdout 是什么?

子进程的默认 stdin 和 stdout 是什么?

我想知道子进程的默认标准输入和标准输出是什么(如果有这样的默认值)。子进程的 stdin 和 stdout 与其父进程相同吗?这是从父母那里继承的东西还是父母设定的东西?或者子进程的stdin和stdout是否插入到父进程的stdin和stdout中?

根据我的理解,父级和子级不是通过管道传输的,而是首先克隆,所以我认为子级的 stdin 和 stdout 与父级完全相同,但我不确定。

例如,在bash作为登录 shell 运行的终端中,如果我键入,sh它将创建一个子 shell 进程,该进程将具有键盘的 stdin 和终端屏幕的 stdout,因此与其父级相同。我想了解孩子的标准输入和标准输出是如何定义的以及它们是什么。

我想知道,例如在这种情况下,如果孩子的标准输入和标准输出与父母的一样,那是因为父母的标准输入通过管道传输到孩子的标准输入,而父母只是将其输入“重定向”到孩子,或者孩子是否获得了其输入直接从键盘输入。

在同样的情况下,如果父级和子级具有相同的标准输入,这是否意味着父级处理向子级键入的相同命令?为什么我们只能在终端中看到子级的标准输入/输出,而不是其父级的?

答案1

查看 fork(2) 的手册页。子进程继承父进程的文件描述符,包括标准输入和标准输出。对于单个命令,shell 只是让子进程继承这些描述符并将其输出写入终端。对于管道,它分叉每个进程,在一个进程的输出和下一个进程的输入之间建立一个管道,然后执行 (exec(2)) 每个子进程的可执行文件。

答案2

前面的答案是正确的,但我鼓励您进一步学习如何使用 strace。 strace 附加到一个进程,然后打印该进程正在向您的终端进行的每个系统调用。这可能非常有教育意义,也可能有点让人不知所措。每个系统调用都有一个手册页,您将看到程序正在执行的每一个小动作的详细信息。它对于调试有问题的进程非常有用。

相关内容