gpt4 book ai didi

c - 失败时返回代码。正面还是负面?

转载 作者:IT王子 更新时间:2023-10-29 00:49:20 25 4
gpt4 key购买 nike

在 Linux 中的特殊情况下,C 程序可能无法执行。
示例:您分配了一些空间,但操作系统拒绝了它。

char *buffer = (char *) malloc(1024);
if (buffer == NULL)
return ENOMEM;

此失败由传递给操作系统的返回代码标记。
  • 返回码 0 (EXIT_SUCCESS) 被标记为成功执行。
  • 不为 0 的返回码被标记为失败。

  • 所以我的问题是, 当程序检测到错误时,约定是什么。
    它应该返回正返回代码还是负返回代码?


    我的教授告诉我在 UNIX/Linux 中总是返回一个否定的错误代码。但是 errno-Codes 都是正整数。 EXIT_FAILURE中的define-Statement也是1,一个正整数。
    所以我的代码应该是这样的:
    char *buffer = (char *) malloc(1024);
    if (buffer == NULL)
    return -ENOMEM;

    或者喜欢上面的代码?我从 Linux-Kernel-Modules 中了解到,在大多数情况下,它们在失败时返回负错误代码。

    谢谢你的帮助。

    最佳答案

    So my question is, what is the convention, when a program detects an error. Should it return a positive or a negative return code ?



    您没有做出这种选择的奢侈(或责任)。一般来说,从 C 的角度来看,您的选择分为三类:
  • 您指定的退出状态是 0EXIT_SUCCESS (不一定是不同的)。这表示成功完成。
  • 您指定的退出状态是 EXIT_FAILURE .这表示未成功完成。
  • 您指定的退出状态是其他任何状态。

  • 向宿主环境发出信号的结果在每种情况下都是实现定义的,尽管在第一种情况下它表示成功,而在第二种情况下它表示失败。

    现在,在 Linux 和其他实现 POSIX 的操作系统上 exit()语义,实现定义是标准化的:

    The value of status may be 0, EXIT_SUCCESS, EXIT_FAILURE, or any other value, though only the least significant 8 bits (that is, status & 0377) shall be available from wait() and waitpid();



    ( IEEE Std 1003.1-2008, 2016 Edition ; 强调)。这些是传统的 UNIX 语义;只有您指定的退出状态的最低有效 8 位才重要,因此符号丢失。但是,当前版本的 POSIX 继续说:

    the full value shall be available from waitid() and in the siginfo_t passed to a signal handler for SIGCHLD.



    因此,如果父进程知道要查找一个负数,您可以将它传递给一个负数。然而,一般来说,它不会这样做。特别是,如果父进程是 shell,那么它就不会这样做。

    My professor told me in UNIX/Linux allways to return a negative error code.



    这听起来更像是关于 main() 以外的函数的函数返回码的说明。 ,但我不明白为什么你认为我们对你教授的意思的第二次猜测比直接要求你的教授澄清更可靠。

    But the errno-Codes are all positive integers.



    好吧,与您的教授澄清的另一件事是他是否给了您关于他希望您如何为他的类(class)编写函数的具体说明(更有可能),或者他是否对通用 C 或 POSIX 约定做出了断言(不太可能,因为有很多 POSIX 函数它不是真的),或者其他东西。

    请注意,C 标准库函数不会返回 errno代码。当他们返回一个指示失败的代码(通常但不总是负数)时,程序员有义务查阅 errno变量的详细原因——函数返回代码通常不携带该信息。一些由 POSIX 标准化但不是 C 标准化的函数确实返回 errno直接编码;显然,这些不符合你教授的处方。

    另请注意 errno值用于在同一程序调用的函数之间进行通信,而不是用于与程序的环境进行通信。它们不打算用作程序退出状态,特别是不能保证它们的值适合八位(见上文)。

    Also the define-Statement of EXIT_FAILURE in is 1, a positive integer. So should my code look like this:


    EXIT_FAILURE的值是依赖于实现的。因此,您只能从中收集特定于实现的见解。但是,正如您所看到的,在您的实现中指示程序失败的通用退出状态是 1 .

    在 Linux 和其他 POSIX(-ish) 系统上,您可以通过选择 1 到 125 之间的失败状态来实现与 shell 的最佳集成,因为 shell 指定了状态 126-255 的特殊意义,当然,将状态 0 解释为成功。

    char *buffer = (char *) malloc(1024);
    if (buffer == NULL)
    return -ENOMEM;

    or like the code above? I know from Linux-Kernel-Modules that in most cases they return a negative error code on failure.



    再次,没有。 Errno 代码不打算用作程序退出代码,只有在相当特殊的情况下,您才应该尝试以否定状态退出。一个常见的约定是向 stderr 写一条信息性错误消息。 ( perror() 正是为了这个目的),然后以状态 1 或(更好,IMO) EXIT_FAILURE 退出.

    如果您想提供描述故障性质的退出代码,则由您决定在每个程序的基础上定义它们的值和重要性,请记住,为了获得最佳兼容性,您只能使用 1 - 125。

    关于c - 失败时返回代码。正面还是负面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47265667/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com