C语言中退出代码11的含义是什么?

18
在C语言中,退出码11的一般含义是什么?我查找了很多资料都没有找到确定的答案,所以想在这里问一下。当我尝试向一个向量添加元素时会出现此问题。

4
你确定你指的是“退出代码”,而不是“信号11”吗? - Kerrek SB
1
也许你混淆了退出码和返回码,甚至是Kerrek提到的信号。请展示导致问题的源代码。 - Marged
哪个平台?Linux、Windows还是一般性的? - Werner Henze
对于分段错误,这是一个非常有用的故障排除文章:https://www.nsnam.org/wiki/HOWTO_understand_and_find_cause_of_exited_with_code_-11_errors - Channa
3个回答

17
您没有找到确定的答案,因为实际上并没有一个。程序的作者可以自行决定他们想要使用哪些退出代码。标准C只规定exit(0)exit(EXIT_SUCCESS)表示程序成功执行,而exit(EXIT_FAILURE)则表示发生了某种错误。(从main返回一个值等价于使用该值调用exit。)大多数常见操作系统,包括Windows、Linux、OSX等,将0用于表示成功,将1到255之间的值用于指示错误;但是选择错误代码仍然取决于应用程序编写者,值11并没有什么特别的意义。

在Linux和大多数其他Unix变体中,信号编号11表示分段错误,如Kerrek SB所指出的。当程序进行某种无效的内存访问时,就会发生分段错误,因此访问超出边界的数组,指针算术错误或尝试访问空指针或其他指针相关错误都有可能导致分段错误。信号11与退出码11不同:当程序由于信号而死亡时,它被标记为被信号杀死,而不是正常退出。Unix shell通过报告信号号码加上128的退出码来报告信号,因此分段错误的退出码为139。


8
其他回答可能忽略了“退出代码”这个短语中可能存在的歧义。我猜你所指的“退出代码”是使用wait系统调用获取的状态代码,例如:
/* assume a child process has already been created */
int status;
wait(&status);
printf("exit code %d\n", status);

如果像这样做,如果子进程发生了段错误,你可能会看到"退出代码11"。如果子进程实际调用了exit(11),则可能会看到"退出代码2816"。
最好将这些内容称为"等待代码"或"等待状态"而不是"退出代码",以避免与传递给exit的值混淆。等待代码包含多个信息打包成单个整数。通常,不应直接查看整数(如上面那个printf中所做的)。相反,应使用来自<sys/wait.h>W*宏进行分析。
首先使用 WIF * 宏找出发生的kind 类型,然后使用该信息来决定使用哪些其他 W * 宏获取详细信息。
if(WIFEXITED(status)) {
  /* The child process exited normally */
  printf("Exit value %d\n", WEXITSTATUS(status));
} else if(WIFSIGNALED(status)) {
  /* The child process was killed by a signal. Note the use of strsignal
     to make the output human-readable. */
  printf("Killed by %s\n", strsignal(WTERMSIG(status)));
} else {
  /* ... you might want to handle "stopped" or "continued" events here */
}

0

并没有规定应用程序在特定情况下必须设置哪些退出代码的标准。完全由程序员决定哪些退出代码表示哪些错误甚至成功!

有时,程序员决定任何与零不同的值都表示错误,有时这个值等于操作系统的错误代码。

在Windows上,退出代码11可能会因文件问题而使用。如果您想要此错误代码的描述(它是特定于Windows而不一定是您的应用程序),请运行net helpmsg 11


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