com*_*tty 6 c linux return errno
C程序在特殊情况下在Linux中可能无法执行。示例:您分配了一些空间,但操作系统拒绝了它。
char *buffer = (char *) malloc(1024);
if (buffer == NULL)
return ENOMEM;
Run Code Online (Sandbox Code Playgroud)
此故障由交付给OS的返回码标记。
所以我的问题是,当程序检测到错误时,约定是什么?它应该返回正数还是负数返回码?
我的教授告诉我在UNIX / Linux中始终返回负错误代码。但是errno码都是正整数。同样,EXIT_FAILURE中的define-Statement为1,为正整数。所以我的代码应该像这样:
char *buffer = (char *) malloc(1024);
if (buffer == NULL)
return -ENOMEM;
Run Code Online (Sandbox Code Playgroud)
还是喜欢上面的代码?我从Linux内核模块知道,在大多数情况下,它们在失败时会返回负错误代码。
感谢您的帮助。
Joh*_*ger 14
所以我的问题是,当程序检测到错误时,约定是什么。它应该返回正返回代码还是负返回代码?
您没有做出这种选择的奢侈(或责任)。一般来说,从 C 的角度来看,您的选择分为三类:
您指定的退出状态是0或EXIT_SUCCESS(不一定是不同的)。这表示成功完成。
您指定的退出状态是EXIT_FAILURE。这表示未成功完成。
您指定的退出状态是其他任何状态。
向宿主环境发出信号的结果在每种情况下都是实现定义的,尽管在第一种情况下它表示成功,而在第二种情况下它表示失败。
现在,在 Linux 和其他实现 POSIXexit()语义的操作系统上,实现定义是标准化的:
status 的值可以是
0、EXIT_SUCCESS、EXIT_FAILURE或任何其他值,但只有最低有效位 8 位(即status & 0377)可从wait()和 中获得waitpid();
(IEEE Std 1003.1-2008, 2016 Edition;重点补充)。这些是传统的 UNIX 语义;只有您指定的退出状态的最低有效 8 位才重要,因此符号丢失。但是,当前版本的 POSIX 继续说:
完整的值应可从
waitid()和siginfo_t传递给 的信号处理程序中获得SIGCHLD。
因此,如果父进程知道要查找一个负数,您可以将它传递给一个负数。然而,一般来说,它不会这样做。特别是,如果父进程是 shell,那么它就不会这样做。
我的教授告诉我在 UNIX/Linux 中总是返回一个否定的错误代码。
这听起来更像是关于函数的函数返回代码的指令以外main(),但我不明白为什么你认为我们的第二个猜测你什么意思教授会比直接问你的澄清教授更可靠。
但是 errno-Codes 都是正整数。
好吧,与您的教授澄清的另一件事是他是否向您提供了有关他希望您如何为他的班级编写函数的具体说明(更有可能),或者他是否对通用 C 或 POSIX 约定做出了断言(不太可能,因为有许多 POSIX 函数不是真的),或者其他东西。
请注意,C 标准库函数不返回errno代码。当他们返回一个指示失败的代码(通常,但并不总是,一个负数)时,程序员必须查询errno变量的详细原因——函数返回代码通常不携带该信息。一些功能通过POSIX标准,但不是C做回errno直接代码; 显然,这些不符合你教授的处方。
另请注意,errno值用于在同一程序调用的函数之间进行通信,而不是用于与程序环境进行通信。它们不打算用作程序退出状态,特别是不能保证它们的值适合八位(见上文)。
EXIT_FAILURE中的define-Statement也是1,一个正整数。所以我的代码应该是这样的:
的值EXIT_FAILURE取决于实现。因此,您只能从中收集特定于实现的见解。但是,正如您所看到的,在您的实现中指示程序失败的通用退出状态是1。
在 Linux 和其他 POSIX(-ish) 系统上,您可以通过选择 1 到 125 之间的失败状态来实现与 shell 的最佳集成,因为 shell 指定了状态 126-255 的特殊意义,当然,将状态 0 解释为成功。
Run Code Online (Sandbox Code Playgroud)char *buffer = (char *) malloc(1024); if (buffer == NULL) return -ENOMEM;或者喜欢上面的代码?我从 Linux-Kernel-Modules 了解到,在大多数情况下,它们会在失败时返回负错误代码。
再次,没有。Errno 代码不打算用作程序退出代码,只有在相当特殊的情况下,您才应该尝试以否定状态退出。一个常见的约定是将信息性错误消息写入stderr(perror()正是为了这个目的) ,然后以状态 1 或 (更好,IMO) 退出EXIT_FAILURE。
如果您想提供描述故障性质的退出代码,则由您决定在每个程序的基础上定义它们的值和重要性,请记住,为了获得最佳兼容性,您只能使用 1 - 125 个。
Sta*_*eur -1
5.1.2.2.3 程序终止
\n\n\n\n\n如果 main 函数的返回类型是与 int 兼容的类型,\n 初次调用 main 函数时返回相当于\n 以 main 函数的返回值作为参数调用 exit 函数;11) 到达终止主函数的 } 返回值 0。如果返回类型与 int 不兼容,则返回到主机环境的终止状态是 unspeci\xef\xac\x81ed。
\n
7.22.4.4 退出函数:
\n\n\n\n\n最后,控制权返回到宿主环境。如果 status 的值为 0 或 EXIT_SUCCESS,则返回 status 成功终止的实现形式。如果 status 的值为 EXIT_FAILURE,则返回未成功终止的状态的实现定义形式。否则,返回的状态为实现定义的\xef\xac\x81ned。
\n
我发现这是自我描述的。
\n