stdin / stdout / stderr或cin / cout / cerr进程是否安全?

时间:2017-05-05 07:01:18

标签: linux operating-system

我不是在谈论线程安全,而是通过进程安全我的意思是,对于每个进程,默认情况下OS在启动一个新进程时打开三个文件描述符,即stdin,stdout和stderr,但是我们知道UNIX中的所有内容是文件,所以我假设这些是与不同进程共享的实际物理文件

我的问题(基于假设这些是与所有进程共享的不同文件,当然如果我们有文件描述符,那么我们有文件)是:

  1. 当多个进程同时使用它时,为什么输出到cout / cerr或stdout / stderr之间没有隔行扫描?
  2. 不同的进程如何只共享由它们编写的cout / cerr或stdout / stderr的那一部分?

2 个答案:

答案 0 :(得分:12)

  

...因为我们知道UNIX中的所有内容都是文件......

这是一种过度概括。

  

我假设cout和cerr是与不同进程共享的物理文件。

您的假设不正确。他们不是"身体"文件;它们没有文件名,也没有存储在磁盘上。

coutcerr(通常称为stdout和stderr)是文件描述符。它们可以引用文件,但更常见的是引用终端或管道。每个进程都有自己的文件描述符集; stdin / stdout / stderr只是每个进程用于输入和输出的标准三个文件描述符集的名称。

  

为什么多个进程同时使用输出到cout / cerr之间没有隔行扫描?

另一个不正确的假设。写入相同文件描述符的多个进程可能导致交错输出。但是,写入不同文件描述符的多个进程不会相互干扰。

答案 1 :(得分:2)

要回答您的主要问题,简短的回答将是
请考虑以下流程:

A is running
A is running
A is running
A is running
A forks a new process B

流程B的PDT中的所有条目都将指向A指向的流程,包括stderrstdoutstdin

如果在流程A中打印1000次+,则在流程B中打印1000次-
然后你可以期望你的输出混合如下:
++++++++---------+++++----------+++++------

这是因为他们共享相同的stdout