出口();不管用

Posted

技术标签:

【中文标题】出口();不管用【英文标题】:exit(); is not working 【发布时间】:2014-03-18 16:49:06 【问题描述】:

在我的编程书中,它显示我在没有任何参数的情况下使用了退出 (exit();)。 不幸的是,它不起作用。

有人说使用exit(0);,有人说exit(1); exit(2);exit(3); 它们之间有什么区别,甚至还有exit(4); 吗?

有趣的是,我的编译器不需要stdlib.h 来执行exit(0); 和其余部分。

【问题讨论】:

参见:***.com/questions/1101957/… 不是完全重复...但非常接近。 您的编译器不执行函数exit。它只是将对exit(0) 的调用编译为一些操作码,用于将0 推入堆栈,然后在您的代码部分中跳转(更改指令指针)到函数exit 的地址可执行映像。由于在编译期间该函数的地址是未知的,因此链接器将符号 exit 替换为实际地址。所以总结一下 - 编译器用二进制代码替换 exit(0) 以跳转到一个函数,链接器用函数的地址更新该二进制代码。 【参考方案1】:
void exit( int exit_code );

这里,exit_code 是程序的退出状态。调用后,控制权返回到宿主环境。如果exit_codeEXIT_SUCCESS,则返回实现定义的状态,表示终止成功。如果exit_codeEXIT_FAILURE,则返回实现定义的状态,表示终止不成功。 在其他情况下,返回实现定义的状态值

查看here 了解更多信息。


P.S.:您的编译器不需要stdlib.h 来执行exit(0); 的原因可能是它已被包含在您的代码中的其他头文件所包含,或者正如@devnull 所提到的,当使用gcc 构建,其中exit() 是内置函数之一。

【讨论】:

通常退出代码只与调用程序的人或任何人相关。按照惯例,退出代码 0 通常表示成功,非零退出代码表示为程序定义的特定错误。但这只是一个约定。你知道EXIT_SUCCESSEXIT_FAILURE 在程序本身中是否真的有任何意义吗?即,exit 的行为是否会根据您传递的值而有所不同? @sh1ftst0rm 调用后,控制权返回给宿主环境。如果宿主环境需要根据这个返回的状态进行处理,这将是有意义的。 exit 是内置函数没关系。 gcc 遵循 C90 规则,这意味着如果没有可见,它假定声明 exit。对于任何未声明的函数,无论是否内置,您都会看到相同的行为,尽管 gcc 可能会为内置函数提供更详细的诊断。 什么是退出失败?如果您希望它退出并且它确实退出了,为什么它会失败? @user3328692 这意味着发生了一些事情,你想在它终止后注意宿主环境。【参考方案2】:

有趣的是我的编译器不需要 stdlib.h 来执行 退出(0);以及其余的。

您似乎在使用gccexit 是 gcc 提供的 built-in functions 之一,因此不需要指定的 header。

传递给exit()的参数用于表示终止状态。

【讨论】:

exit 是内置的这一事实可能并不重要。我认为您会看到对未声明函数的任何调用都会出现相同的行为。【参考方案3】:

在 1999 版 ISO C 标准之前,调用没有可见声明的函数是合法的。编译器会假定该函数存在,从而创建一个隐式声明。 (它还假设它返回一个int 类型的结果,而exit() 没有。)如果这个隐式声明与函数的实际定义不匹配,则行为未定义。

从 1999 年标准开始,“隐式 int”规则已被删除,并且没有可见声明的调用(在本例中由 #include <stdlib.h> 提供)变得无效。即使它无效,编译器仍可能发出非致命警告并根据旧规则进行处理; gcc 默认会这样做。

在任何版本的语言中,exit 都需要一个 int 类型的参数。传递0EXIT_SUCCESS(在<stdlib.h> 中定义的宏会导致程序终止并向环境传递一个指示成功的状态。传递EXIT_FAILURE 会导致程序以指示失败的状态终止。

其他参数值的含义C语言没有规定。您通常会看到 exit(1) 表示失败,但这并不是完全可移植的。

(exit 可能是 gcc 中的某种内置函数,但这不会影响语言的规则;在没有可见声明的情况下调用 exit 或在没有可见声明的情况下调用它仍然无效int 参数。如果它是内置的,则可能会影响诊断消息中的详细程度。)

【讨论】:

【参考方案4】:

带有0exit(0) 由进程发送,如果它已正确结束。当出口产生某种错误时使用其他数字。

同时您允许父进程使用waitpid 捕获来自其子进程的退出信号:

如果你让进程同时结束,这样的话:while(waitpid(1,&exit_code,0) > 0),其中exit_code是一个整数,获取已完成进程的退出代码

或者这样:waitpid(-1,NULL,0)如果你让它们按顺序完成

如果将此代码放在waitpid 之后或放入waitpid 的循环中,则可以获得子进程的退出状态:

pid = waitpid(-1, &exit_code, 0);  //getting the finished process' PID

if (WIFEXITED(exit_code))  

int statcode = WEXITSTATUS(exit_code); 
printf(“Process with PID %d has finished with status %d, pid, statcode); 


如果您想确保 exit() 有效,请尝试此操作

【讨论】:

以上是关于出口();不管用的主要内容,如果未能解决你的问题,请参考以下文章

Apache官方强心剂:开源不受出口管理条例约束!

什么是出口IP

化妆品出口必须要做MSDS报告吗

角,二级出口路由器不工作

为啥“视图”是 UIViewController 上的一个出口?

怎样利用IPERF测试互联/出口流量带宽