在C语言中,exit(0)和exit(1)有什么区别?

112

有人能告诉我吗?在C语言中,exit(0)exit(1)有什么区别?

11个回答

131

exit(0)exit(1)在C语言中有何不同?

exit(0)表示程序成功终止并且完全可移植,而exit(1)(通常)表示终止失败。但是,它的使用是非可移植的。

请注意,C标准定义了EXIT_SUCCESSEXIT_FAILURE来返回C程序的终止状态。

0EXIT_SUCCESS是标准指定的值,用于指示成功终止,然而,只有EXIT_FAILURE是用于返回失败终止的标准值。在许多实现中,1被用于相同目的。


参考资料:

C99标准:7.20.4.3 exit函数
第5段

最后,控制权将返回给主机环境。如果状态的值为零或EXIT_SUCCESS,则将返回一种实现定义的形式表示成功终止的状态。如果状态的值为EXIT_FAILURE,则返回一种实现定义的形式表示未成功终止的状态。否则,返回的状态是实现定义的。


1
你能解释一下非可移植性吗?特别是,非零的退出代码表示不同的失败模式。应用程序通常使用这个来提供更多信息。因此,单个常量(EXIT_FAILURE)是不足够的。 - Konrad Rudolph
@CatPlusPlus C已经被移植到了不止那些系统。 - Peter M
1
@Als:POSIX是一个标准。C标准可能会说“实现定义”,但这并不等同于说“不可移植”,因为事实上实现确实同意采用这种约定。 - Cat Plus Plus
1
@PeterM:找一个不使用这种约定的平台给我。可能是一些专门的/嵌入式/独立/随便什么环境,在那里exit的可移植性是你最不需要担心的(见鬼,甚至可能没有C库可用。没有什么是可移植的!!!111)。 - Cat Plus Plus
4
在OpenVMS上,调用任何奇数值的exit表示成功。 exit(0)被视为特殊情况,以符合C规范。是的,POSIX是一个标准,但并不是所有系统都符合它。如果您想编写假定符合POSIX的代码,则可以这样做,但这会限制您的代码的可移植性。 - Keith Thompson
显示剩余3条评论

13

exit在C语言中接受一个表示退出状态的整数。

退出成功

通常,状态码为0被认为是成功的,或者是由程序成功执行引起的有意退出。

退出失败

状态码为1被认为是失败的,通常意味着程序必须退出,因为某些原因无法在正常的程序流程中成功完成所有操作。

这里有一个GNU资源讨论退出状态。


正如@Als所述,应使用两个常量来代替0和1。

EXIT_SUCCESS被标准定义为零。

虽然标准没有限制EXIT_FAILURE必须是1,但许多系统确实将其实现为1。


9

exit(0) 表示程序没有出现错误结束。 exit(1) 表示出现了错误.

你可以使用不同于1的值来区分不同类型的错误。


4

区别在于前一种情况返回给环境的值为0,而后一种情况返回的值为1

$ ./prog_with_exit_0
$ echo $?
0
$

并且

$ ./prog_with_exit_1
$ echo $?
1
$

还要注意的是,作为exit函数参数使用的宏值EXIT_SUCCESSEXIT_FAILURE是实现定义的,但通常分别设置为0和非零数字(POSIX要求EXIT_SUCCESS为0)。因此,exit(0)通常表示成功,而exit(1)表示失败。
main函数中使用带参数的exit函数调用等效于带相同参数的return语句。

2

退出函数。在C语言中,退出函数会调用所有注册了atexit的函数并终止程序。

exit(1)表示程序(进程)以失败结束。 文件缓冲区被刷新,流被关闭,临时文件被删除

exit(0)表示程序(进程)以成功结束。


2

exit是一个系统调用,用于结束调用它的正在运行的进程。exit函数的参数用于向父进程通知子进程的状态。因此,exit(0)经常被用来表示进程成功执行,而exit(1)则表示出现错误。参考链接


2

exit(0)等效于exit(EXIT_SUCCESS)。

exit(1)等效于exit(EXIT_FAILURE)。

通常,当进程退出失败时,会返回任何正值,您可以通过使用$?在shell中找到它。

大于128的值是由信号引起的终止。因此,如果任何shell命令被信号终止,则返回状态必须为(128+信号编号)。

例如:

如果任何shell命令被SIGINT终止,则$?将给出130(128+2) (这里的2是SIGINT的信号编号,请使用kill -l进行检查)


1

exit(0) 表示程序(进程)正常成功终止。

exit(1) 表示程序(进程)正常不成功终止。

如果您想观察这个问题,您必须了解 Unix 中的信号处理和进程管理...

了解 sigactionwatipid() 等 API ...


1

exit(0)main()函数中的行为类似于return 0,而exit(1)的行为类似于return 1。标准规定,如果程序成功结束,则main函数应该返回0,而非零值表示程序以某种错误终止。


1
当可执行文件结束(退出)时,它会向运行它的 shell 返回一个值。exit(0)通常表示一切正常,而exit(1)表示出现了问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接