出口();不管用
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_code
为EXIT_SUCCESS
,则返回实现定义的状态,表示终止成功。如果exit_code
是EXIT_FAILURE
,则返回实现定义的状态,表示终止不成功。 在其他情况下,返回实现定义的状态值。
查看here 了解更多信息。
P.S.:您的编译器不需要stdlib.h
来执行exit(0);
的原因可能是它已被包含在您的代码中的其他头文件所包含,或者正如@devnull 所提到的,当使用gcc
构建,其中exit()
是内置函数之一。
【讨论】:
通常退出代码只与调用程序的人或任何人相关。按照惯例,退出代码 0 通常表示成功,非零退出代码表示为程序定义的特定错误。但这只是一个约定。你知道EXIT_SUCCESS
和EXIT_FAILURE
在程序本身中是否真的有任何意义吗?即,exit
的行为是否会根据您传递的值而有所不同?
@sh1ftst0rm 调用后,控制权返回给宿主环境。如果宿主环境需要根据这个返回的状态进行处理,这将是有意义的。
exit
是内置函数没关系。 gcc 遵循 C90 规则,这意味着如果没有可见,它假定声明 exit
。对于任何未声明的函数,无论是否内置,您都会看到相同的行为,尽管 gcc 可能会为内置函数提供更详细的诊断。
什么是退出失败?如果您希望它退出并且它确实退出了,为什么它会失败?
@user3328692 这意味着发生了一些事情,你想在它终止后注意宿主环境。【参考方案2】:
有趣的是我的编译器不需要 stdlib.h 来执行 退出(0);以及其余的。
您似乎在使用gcc
。 exit
是 gcc 提供的 built-in functions 之一,因此不需要指定的 header。
传递给exit()
的参数用于表示终止状态。
【讨论】:
exit
是内置的这一事实可能并不重要。我认为您会看到对未声明函数的任何调用都会出现相同的行为。【参考方案3】:
在 1999 版 ISO C 标准之前,调用没有可见声明的函数是合法的。编译器会假定该函数存在,从而创建一个隐式声明。 (它还假设它返回一个int
类型的结果,而exit()
没有。)如果这个隐式声明与函数的实际定义不匹配,则行为未定义。
从 1999 年标准开始,“隐式 int
”规则已被删除,并且没有可见声明的调用(在本例中由 #include <stdlib.h>
提供)变得无效。即使它无效,编译器仍可能发出非致命警告并根据旧规则进行处理; gcc 默认会这样做。
在任何版本的语言中,exit
都需要一个 int
类型的参数。传递0
或EXIT_SUCCESS
(在<stdlib.h>
中定义的宏会导致程序终止并向环境传递一个指示成功的状态。传递EXIT_FAILURE
会导致程序以指示失败的状态终止。
其他参数值的含义C语言没有规定。您通常会看到 exit(1)
表示失败,但这并不是完全可移植的。
(exit
可能是 gcc 中的某种内置函数,但这不会影响语言的规则;在没有可见声明的情况下调用 exit
或在没有可见声明的情况下调用它仍然无效int
参数。如果它是内置的,则可能会影响诊断消息中的详细程度。)
【讨论】:
【参考方案4】:带有0
的exit(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()
有效,请尝试此操作
【讨论】:
以上是关于出口();不管用的主要内容,如果未能解决你的问题,请参考以下文章