所以我的问题是,当程序检测到
错误。它应该返回一个正的还是负的返回码?
您没有做出这种选择的奢侈(或责任)。一般来说,从 C 的角度来看,您的选择分为三类:
在每种情况下,向宿主环境发出信号的结果都是实现定义的,尽管在第一种情况下是成功的,而在第二种情况下是失败的。
现在,在 Linux 和其他实现 POSIX exit() 语义的操作系统上,实现定义已标准化:
status 的值可以是0、EXIT_SUCCESS、EXIT_FAILURE 或任何其他值,尽管只有最低有效 8 位(即status & 0377)可从@987654331 获得@和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 do 标准化的函数直接返回 errno 代码;显然,这些不符合你教授的处方。
还请注意,errno 值用于在同一程序调用的函数之间进行通信,而不是用于与程序环境进行通信。它们不打算用作程序退出状态,特别是不能保证它们的值适合八位(见上文)。
EXIT_FAILURE 中的define-Statement 也是1,一个正整数。所以我的代码应该是这样的:
EXIT_FAILURE 的值取决于实现。因此,您只能从中收集特定于实现的见解。但是,如您所见,在您的实现中指示程序失败的通用退出状态是1。
在 Linux 和其他 POSIX(-ish) 系统上,您可以通过选择 1 到 125 之间的故障状态来实现与 shell 的最佳集成,因为 shell 指定状态 126-255 的特殊意义,当然,解释状态 0成功。
char *buffer = (char *) malloc(1024);
if (buffer == NULL)
return -ENOMEM;
或喜欢上面的代码?我从 Linux-Kernel-Modules 知道,在大多数情况下
如果失败,它们会返回一个否定的错误代码。
再次,不。 Errno 代码不打算用作程序退出代码,只有在相当特殊的情况下,您才应该尝试以否定状态退出。一个常见的约定是向stderr 写入一条信息性错误消息(perror() 正是用于此目的),然后以状态 1 或(更好,IMO)EXIT_FAILURE 退出。
如果您想提供描述故障性质的退出代码,那么您可以根据每个程序定义它们的值和重要性,请记住,为了获得最佳兼容性,您只能使用 1 - 125 .