关于STDIN,STDOUT,STDERR和返回值

时间:2015-04-09 05:28:03

标签: c

我可以使用< >2>STDINSTDOUTSTDERR重定向数据流。

不知怎的,我把它们与返回值混淆了。

如果返回值为12如何理解?

如果返回值为-1如何理解?

break可以退出循环,但继续执行以下代码,return怎么样?看到return后,它会使用返回码终止main(),对吗?

3 个答案:

答案 0 :(得分:2)

要回答这个问题,我们参考C99标准。如果你阅读 7.20.4.3退出功能,你会发现以下声明:

  

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

这里应该强调的是,C标准没有规定退出状态的任何特定代码。在上面的代码段中,您可以看到提到的 zero ,它纯粹是exit() API的一部分。重写句子的其余部分, 0 可以映射到任何其他实现定义的成功终止。同样,无法保证EXIT_SUCCESSEXIT_FAILURE的定义不会映射到其他代码。特别是,它甚至可能不会以整数结束。

此外,如果您查看 7.20.4.6系统功能,您会注意到:

  

返回   3如果参数是空指针,则仅当命令处理器可用时,系统函数才返回非零值。如果参数不是空指针,并且系统函数确实返回,则返回实现定义的值。

确认退出代码纯粹是实现定义的,您不能依赖任何特定的行为。


现在,POSIX扩展了一点。如果您阅读stdlib.h标题,则会找到:

  

EXIT_FAILURE

     

exit()终止失败;评估为非零值。

     

EXIT_SUCCESS

     

exit()成功终止;评估为0。

这已经限制了实现使用0成功退出。但是,它并没有真正定义哪个非零值用于失败。

如果你阅读exit()功能,你会发现:

  

status的值可以是0,EXIT_SUCCESS,EXIT_FAILURE或任何其他值,但只有最低有效8位(即status&amp; 0377)可供等待的父进程使用。

它还通过保证范围0 ... 255中的退出状态可供其他进程使用来扩展C定义。

因此,POSIX将零定义为成功退出,EXIT_FAILURE(某些非零值)作为不成功的退出,并留下剩余的值供程序使用。

但是,如果要解析其他进程的终止代码,则还应该查看wait()函数。它定义了用于处理非正常终止状态的返回状态的其他宏,例如通过信号终止。


如果我们更进一步,我们可以发现FreeBSD引入sysexits.h标头来进一步定义退出代码。

  

成功退出始终由状态0或EX_OK指示。错误编号从EX__BASE开始,以减少与随机程序可能已经返回的其他退出状态发生冲突的可能性。代码的含义大致如下:

     

EX_USAGE(64)该命令使用不正确,例如,参数数量错误,标志错误,参数语法错误等等。   [...]

这意味着为FreeBSD编写的应用程序可能使用明确定义的退出代码64 +。


简要总结一下:

  1. C标准仅定义用于返回成功不成功退出的API。它没有定义如何使用,传递或获得该结果。
  2. POSIX强调使用 zero 成功,并保证在正常进程终止的情况下,退出代码的8个最低有效位将可供其他进程使用(例如通过{{1 }})。
  3. FreeBSD保留退出代码64+以创建明确定义的错误条件退出代码。
  4. 标准走了多远。现在,实际上大多数程序使用来表示简单的成功,并使用非零代码来指示各种其他状态。使用退出代码传递特定信息的程序通常在联机帮助页中对其进行描述。

    例如,如果你看一下GNU wait()

      

    退出状态为0表示未发现差异,1表示一些差异   发现了差异,2意味着麻烦。

答案 1 :(得分:1)

如注释中所述,如果任何命令执行返回0则表示执行成功,而任何非零值表示执行该特定命令时出错。执行命令后,可以看到返回值 unix中的echo $?。 大多数时候,非零返回值指示错误,即为已知错误预定义返回值。这些也称为退出代码。

  

尝试将退出状态编号系统化(参见   /usr/include/sysexits.h),但这适用于C和C ++   程序员。类似的脚本标准可能是合适的。

  

出于shell的目的,以零退出状态退出的命令已成功。非零退出状态表示失败。使用这种看似反直觉的方案,因此有一种明确定义的方式来指示成功和各种方式来指示各种故障模式。当命令终止于编号为N的致命信号时,Bash使用值128 + N作为退出状态。

如果找不到命令,则创建执行它的子进程返回状态127.如果找到命令但不可执行,则返回状态为126.

如果命令因扩展或重定向期间的错误而失败,则退出状态大于零。

所有Bash内置函数如果成功则返回零状态,失败时返回非零状态,因此条件和列表构造可以使用它们。所有内置函数都返回退出状态2,表示使用不正确。

答案 2 :(得分:1)

MSDOS退出代码只有1个字节,并且可能有先前的先例。 Windows继续使用此标准,将退出代码限制在0到255之间.MSDOS / Windows命令解释程序将退出代码存储在名为ERRORLEVEL的命令解释程序变量中,该变量可用于批处理文件。还有一个名为%ERRORLEVEL%的环境变量,默认为ERRORLEVEL,但环境变量可以设置为ERRORLEVEL以外的其他值。可能存在退出代码用于C中的switch case语句之类的情况,而不是错误指示符。我不确定如何使用退出代码* nix操作系统脚本。