stdin,stdout,stderr是如何关闭的

时间:2018-03-20 12:22:58

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

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

或者例如在java中,jvm会在正在运行的Java程序stdin时关闭stdoutstderrexit

可能存在一些例外情况,例如一些旧的程序员提到的,因此我将语言范围缩小到仅适用于Java,C,C ++

2 个答案:

答案 0 :(得分:3)

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

  

<强>描述

     

exit函数会导致正常程序终止。没有   调用at_quick_exit函数注册的函数。如果程序多次调用exit函数或调用   除quick_exit函数之外的exit函数   行为未定义。

     

首先,调用atexit函数注册的所有函数,   按照其注册的相反顺序,除了一个功能   在之前已注册的任何函数之后调用   在注册时已被调用。如果,在期间   调用任何此类函数,调用longjmp函数   那会终止对注册函数的调用,行为   未定义。

     

接下来,所有带有未写入缓冲数据的开放流都是   刷新,关闭所有打开的流,并创建所有文件   tmpfile功能已删除。

     

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

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

答案 1 :(得分:0)

您的问题是高度针对特定系统的。首先,这些术语有多重含义。让我们来看看太监变体的具体例子。在那里,每个进程都是父进程的副本。 shell在运行时为子进程设置文件号0,1和2是正常的。

这些&#34;文件&#34;被称为stdin,stdout和stderr。

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

所以,就在你所指的stdio等人,只是在太监的土地上,你的问题有两个答案。作为文件号或由c库创建的符号?

如果您要引用库符号,则必须设置库以处理程序退出以刷新缓冲区。

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