在大多数现代编程语言中,程序员不需要关闭 stdin
,stdout
,stderr
。是否意味着操作系统通常会处理stdin
,stdout
,stderr
的结束?
或者例如在java
中,jvm
会在正在运行的Java程序stdin
时关闭stdout
,stderr
,exit
?
可能存在一些例外情况,例如一些旧的程序员提到的,因此我将语言范围缩小到仅适用于Java,C,C ++
答案 0 :(得分:3)
几乎所有程序都在C运行时运行,因此在正常终止时,应该应用C exit()
函数的规则。每 7.22.4.4 the C Standard的exit
函数:
<强>描述强>
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库创建的符号?
如果您要引用库符号,则必须设置库以处理程序退出以刷新缓冲区。
如果您指的是文件编号,则必须由操作系统处理。