【问题标题】:How the stdin, stdout, stderr are closed [closed]标准输入、标准输出、标准错误如何关闭 [关闭]
【发布时间】:2018-08-29 06:18:57
【问题描述】:

在大多数现代编程语言中,程序员不需要关闭stdin,stdout,stderr。这是否意味着操作系统通常会处理stdinstdoutstderr 的关闭?

或者例如在java中,jvm会在运行Java程序exit时关闭stdinstdoutstderr

可能会有一些老程序员提到的例外情况,因此我将语言范围缩小到仅 Java、C、C++

【问题讨论】:

  • 太宽泛了,也许你最好选择一种操作系统和一种语言
  • C++ 库将在程序正常终止之前刷新这些流缓冲的所有内容。该进程继承了底层文件,因此无需关闭任何内容,但从技术上讲,操作系统将在进程终止时释放该进程使用的所有资源。
  • @user463035818 我敢打赌这不依赖于单一语言或操作系统
  • 我敢肯定,至少,关于 C++ 库刷新输出流的部分隐藏在构成当前 C++ 标准的 1400 多个页面中的某个地方。但这是一个很小的细节,也许,如果你解释了你需要“授权答案”的真正原因,那么有人可能会有足够的动力去查它。

标签: java c++ c io operating-system


【解决方案1】:

您的问题与系统高度相关。首先,这些术语具有多重含义。让我们以eunuchs-variants的具体例子为例。在那里,每个进程都是父进程的副本。 shell在运行时为子进程设置文件号0、1、2是正常的。

这些“文件”被称为标准输入、标准输出和标准错误。

C 程序员有两层库。在 eunuchs 变体中,您可以访问对文件创意进行操作的系统服务,例如读取或写入。此外,标准 C 库在这些(例如 fread 和 fwrite)上具有分层的功能,用于缓冲。它还定义了符号 stdin、stout 和 stderr,这些符号引用结构作为 f_____ 文件函数的参数。嵌入在这些结构中的某处是文件编号。

所以,就在太监之地,您的问题有两个答案,具体取决于您是否指的是 stdio 等人。是文件编号还是 c 库创建的符号?

如果您指的是库符号,则必须将库设置为处理程序退出以刷新缓冲区。

如果您指的是文件编号,则必须由操作系统处理。

【讨论】:

  • 在这种情况下使用“太监”不适合对 SO 的回答。请编辑您的答案。
【解决方案2】:

几乎所有程序都在 C 运行时下运行,因此在正常终止时应适用 C exit() 函数的规则。根据7.22.4.4 the C Standardexit函数

说明

exit 函数会导致程序正常终止。不 由at_quick_exit 函数注册的函数被调用。如果一个程序多次调用exit 函数,或者调用 quick_exit 函数除了 exit 函数, 行为未定义。

首先调用atexit函数注册的所有函数, 以他们注册的相反顺序,除了一个函数 在任何先前注册的函数之后调用 在注册时已经被调用。如果,期间 调用任何此类函数,调用longjmp 函数 这将终止对注册函数的调用,行为 未定义。

接下来,所有带有未写入缓冲数据的打开流 刷新,所有打开的流都关闭,所有由 tmpfile 函数被移除。

最后,控制权返回到宿主环境。如果 status 的值为零或 EXIT_SUCCESS,一个 状态的实现定义形式 成功终止 返回。如果status 的值为EXIT_FAILURE,则状态的实现定义形式 不成功的终止被返回。否则返回的状态是实现定义的。

对于未在符合标准的 C 运行时下运行的任何进程,进程终止时发生的情况将由实现定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 2013-05-11
    • 2013-01-11
    相关资源
    最近更新 更多