【问题标题】:Is stdin/ stdout/ stderr or cin/ cout/ cerr process safe?stdin/stdout/stderr 或 cin/cout/cerr 进程是否安全?
【发布时间】:2017-05-05 07:01:17
【问题描述】:

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

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

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

【问题讨论】:

  • 你的假设不正确
  • @RichardCritten 你能详细说明为什么吗?当我们有文件描述符时,我们也应该通过文件描述符 en.wikipedia.org/wiki/File_descriptor 的定义来拥有文件
  • 正如链接所说,它们是每个进程的而不是物理文件。文件句柄是一个抽象概念,不需要引用实际的文件。

标签: linux operating-system


【解决方案1】:

...我们知道 UNIX 中的一切都是文件...

这是一个过度概括。

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

你的假设是错误的。它们不是“物理”文件;它们没有文件名,也不存储在磁盘上。

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

当多个进程同时使用时,为什么输出到 cout/cerr 之间没有交错?

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

【讨论】:

  • 具有相同文件描述符的 stdin/stdout/stderr 即 0,1 和 2 的多个进程如何区分自己的 stdin/stdout 和 stderr?
  • 文件描述符是特定于进程的,它们不会跨进程共享,除非有父子关系
  • @Vishrant 文件描述符不是全局的,它们对每个进程都是唯一的
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2017-05-24
    • 2014-03-27
    • 1970-01-01
    • 2011-01-16
    • 2023-04-08
    • 2013-11-08
    • 1970-01-01
    • 2011-04-16
    • 2017-07-14
    相关资源
    最近更新 更多