C/C++是否有一套标准的退出代码?

2ekbmq32  于 5个月前  发布在  C/C++
关注(0)|答案(4)|浏览(104)

AFAIK,退出代码编号可能会根据应用程序和项目中采用的约定而有所不同。然而,我想知道是否有C/C++项目的退出代码标准列表。

tvokkenx

tvokkenx1#

就C++本身而言,只有三个值,指定两个条件:0EXIT_FAILUREEXIT_SUCCESS
0EXIT_SUCCESS都给予实现定义的成功退出指示。它们在标准中的描述方式相同,但不能保证它们实际上是相同的值(尽管它们在大多数典型平台上都是)。
EXIT_FAILURE给出了实现定义的故障指示。
大多数常见的平台,如Linux、Windows、MacOS和 *BSD,都会保留返回给shell的至少8个最低有效位。

bvjxkvbb

bvjxkvbb2#

程序退出码

简短的回答:没有,除了EXIT_SUCCESSEXIT_FAILURE,它们在stdlib.h中定义。参见这里:https://en.cppreference.com/w/c/program/EXIT_status
从上面的社区wiki链接:

备注

EXIT_SUCCESS和值0都表示成功的程序执行状态(参见exit),尽管不要求EXIT_SUCCESS等于0。

函数返回码

也没有。
但是,大多数函数都有一个描述,可以在https://en.cppreference.com/w/(一个相当全面的社区wiki)或https://cplusplus.com/(也是一个社区wiki)上查找,以帮助您了解返回值应该是什么。

errno错误号,当函数调用失败或出现错误时,分配给errno全局变量

也没有,但大多数系统将为该系统提供一个“标准化”的错误号集。

  • 但是 *,errno错误号是由返回错误的函数的 * 调用者 * 使用的。它们 * 不是 * 当程序崩溃时作为错误代码返回的。

来自@John Bollinger的评论:
错误号是传递给遇到错误的函数的调用者的值,通过errno变量或作为函数返回值,具体取决于函数。它们既不是用来作为程序退出状态,也没有任何以这种方式使用它们的惯例。
当函数调用失败时,我通常会打印errno值,以便代码作者或用户可以调试运行时崩溃。打印errno值以及通过strerror(errno)打印的可读描述可以这样做:

#include <errno.h>   // `errno`
#include <string.h>  // `strerror(errno)`

// ...

// in some function:

int retcode = clock_gettime(CLOCK_REALTIME, &ts);
if (retcode == -1)
{
    printf("Failed to get a timestamp. errno = %i: %s\n",
        errno, strerror(errno));
}

字符串
你可以在我的程序中看到这种用法,例如:eRCaGuy_hello_world repo中的timing_clock_gettime_full_demo.c

errno s定义的示例,适用于各种系统

1.对于Linux:https://man7.org/linux/man-pages/man3/errno.3.html
请注意,在这些错误名称中,它们还指示它是POSIX标准(POSIX.1-2001POSIX.1-2008)的一部分,还是C99标准的一部分。
实际的错误号可以通过errno.h头文件来追踪,该头文件可能包含其他文件。例如:以下是Linux上的一些错误号定义:

  1. https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/errno.h,包括:
  2. https://github.com/torvalds/linux/blob/master/include/uapi/asm-generic/errno-base.h
    1.对于Microchip PIC 32 M微控制器:
    你可以在这里看到<errno.h>中的错误代码:https://github.com/ElectricRCAircraftGuy/Microchip_XC32_Compiler/blob/main/xc32-v4.35-src/pic32m-source/newlib/newlib/libc/include/errno.h
    其中包括<sys/errno.h>,错误号实际上是在这里定义的:https://github.com/ElectricRCAircraftGuy/Microchip_XC32_Compiler/blob/main/xc32-v4.35-src/pic32m-source/newlib/newlib/libc/include/sys/errno.h

参见

  1. strerror(errno)提供给定错误代码/编号的描述字符串。参见此处:https://en.cppreference.com/w/c/string/byte/strerror
ars1skjm

ars1skjm3#

AFAIK,退出代码编号可能会根据应用程序和项目中采用的约定而有所不同。
而且,重要的是,对东道国系统的公约。
然而,我想知道是否有一个C/C++项目的退出代码标准列表。
C本身会小心地避免声明任何类似的东西,除了退出状态0表示成功。除此之外,它还指定了宏EXIT_SUCCESSEXIT_FAILURE,它们的(未指定的)值分别表示程序成功和程序失败。
shell命令语言的POSIX规范确实为shell命令指定了一些退出状态。这将属于主机系统约定的范畴,至少在POSIX系统上,避免退出状态与这些冲突是明智的。

eblbsuwk

eblbsuwk4#

我刚刚在我的GNU/Linux系统上发现了/usr/include/asm-generic/errno-base.h/usr/include/asm-generic/errno.h中的退出代码。我相信这些退出代码通常用于C/C++项目:

  • /usr/include/asm-generic/errno-base.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ASM_GENERIC_ERRNO_BASE_H
#define _ASM_GENERIC_ERRNO_BASE_H

#define EPERM        1  /* Operation not permitted */
#define ENOENT       2  /* No such file or directory */
#define ESRCH        3  /* No such process */
#define EINTR        4  /* Interrupted system call */
#define EIO      5  /* I/O error */
#define ENXIO        6  /* No such device or address */
#define E2BIG        7  /* Argument list too long */
#define ENOEXEC      8  /* Exec format error */
#define EBADF        9  /* Bad file number */
#define ECHILD      10  /* No child processes */
#define EAGAIN      11  /* Try again */
#define ENOMEM      12  /* Out of memory */
#define EACCES      13  /* Permission denied */
#define EFAULT      14  /* Bad address */
#define ENOTBLK     15  /* Block device required */
#define EBUSY       16  /* Device or resource busy */
#define EEXIST      17  /* File exists */
#define EXDEV       18  /* Cross-device link */
#define ENODEV      19  /* No such device */
#define ENOTDIR     20  /* Not a directory */
#define EISDIR      21  /* Is a directory */
#define EINVAL      22  /* Invalid argument */
#define ENFILE      23  /* File table overflow */
#define EMFILE      24  /* Too many open files */
#define ENOTTY      25  /* Not a typewriter */
#define ETXTBSY     26  /* Text file busy */
#define EFBIG       27  /* File too large */
#define ENOSPC      28  /* No space left on device */
#define ESPIPE      29  /* Illegal seek */
#define EROFS       30  /* Read-only file system */
#define EMLINK      31  /* Too many links */
#define EPIPE       32  /* Broken pipe */
#define EDOM        33  /* Math argument out of domain of func */
#define ERANGE      34  /* Math result not representable */

#endif

字符串

  • /usr/include/asm-generic/errno.h
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ASM_GENERIC_ERRNO_H
#define _ASM_GENERIC_ERRNO_H

#include <asm-generic/errno-base.h>

#define EDEADLK     35  /* Resource deadlock would occur */
#define ENAMETOOLONG    36  /* File name too long */
#define ENOLCK      37  /* No record locks available */

/*
* This error code is special: arch syscall entry code will return
* -ENOSYS if users try to call a syscall that doesn't exist.  To keep
* failures of syscalls that really do exist distinguishable from
* failures due to attempts to use a nonexistent syscall, syscall
* implementations should refrain from returning -ENOSYS.
*/
#define ENOSYS      38  /* Invalid system call number */

#define ENOTEMPTY   39  /* Directory not empty */
#define ELOOP       40  /* Too many symbolic links encountered */
#define EWOULDBLOCK EAGAIN  /* Operation would block */
#define ENOMSG      42  /* No message of desired type */
#define EIDRM       43  /* Identifier removed */
#define ECHRNG      44  /* Channel number out of range */
#define EL2NSYNC    45  /* Level 2 not synchronized */
#define EL3HLT      46  /* Level 3 halted */
#define EL3RST      47  /* Level 3 reset */
#define ELNRNG      48  /* Link number out of range */
#define EUNATCH     49  /* Protocol driver not attached */
#define ENOCSI      50  /* No CSI structure available */
#define EL2HLT      51  /* Level 2 halted */
#define EBADE       52  /* Invalid exchange */
#define EBADR       53  /* Invalid request descriptor */
#define EXFULL      54  /* Exchange full */
#define ENOANO      55  /* No anode */
#define EBADRQC     56  /* Invalid request code */
#define EBADSLT     57  /* Invalid slot */

#define EDEADLOCK   EDEADLK

#define EBFONT      59  /* Bad font file format */
#define ENOSTR      60  /* Device not a stream */
#define ENODATA     61  /* No data available */
#define ETIME       62  /* Timer expired */
#define ENOSR       63  /* Out of streams resources */
#define ENONET      64  /* Machine is not on the network */
#define ENOPKG      65  /* Package not installed */
#define EREMOTE     66  /* Object is remote */
#define ENOLINK     67  /* Link has been severed */
#define EADV        68  /* Advertise error */
#define ESRMNT      69  /* Srmount error */
#define ECOMM       70  /* Communication error on send */
#define EPROTO      71  /* Protocol error */
#define EMULTIHOP   72  /* Multihop attempted */
#define EDOTDOT     73  /* RFS specific error */
#define EBADMSG     74  /* Not a data message */
#define EOVERFLOW   75  /* Value too large for defined data type */
#define ENOTUNIQ    76  /* Name not unique on network */
#define EBADFD      77  /* File descriptor in bad state */
#define EREMCHG     78  /* Remote address changed */
#define ELIBACC     79  /* Can not access a needed shared library */
#define ELIBBAD     80  /* Accessing a corrupted shared library */
#define ELIBSCN     81  /* .lib section in a.out corrupted */
#define ELIBMAX     82  /* Attempting to link in too many shared libraries */
#define ELIBEXEC    83  /* Cannot exec a shared library directly */
#define EILSEQ      84  /* Illegal byte sequence */
#define ERESTART    85  /* Interrupted system call should be restarted */
#define ESTRPIPE    86  /* Streams pipe error */
#define EUSERS      87  /* Too many users */
#define ENOTSOCK    88  /* Socket operation on non-socket */
#define EDESTADDRREQ    89  /* Destination address required */
#define EMSGSIZE    90  /* Message too long */
#define EPROTOTYPE  91  /* Protocol wrong type for socket */
#define ENOPROTOOPT 92  /* Protocol not available */
#define EPROTONOSUPPORT 93  /* Protocol not supported */
#define ESOCKTNOSUPPORT 94  /* Socket type not supported */
#define EOPNOTSUPP  95  /* Operation not supported on transport endpoint */
#define EPFNOSUPPORT    96  /* Protocol family not supported */
#define EAFNOSUPPORT    97  /* Address family not supported by protocol */
#define EADDRINUSE  98  /* Address already in use */
#define EADDRNOTAVAIL   99  /* Cannot assign requested address */
#define ENETDOWN    100 /* Network is down */
#define ENETUNREACH 101 /* Network is unreachable */
#define ENETRESET   102 /* Network dropped connection because of reset */
#define ECONNABORTED    103 /* Software caused connection abort */
#define ECONNRESET  104 /* Connection reset by peer */
#define ENOBUFS     105 /* No buffer space available */
#define EISCONN     106 /* Transport endpoint is already connected */
#define ENOTCONN    107 /* Transport endpoint is not connected */
#define ESHUTDOWN   108 /* Cannot send after transport endpoint shutdown */
#define ETOOMANYREFS    109 /* Too many references: cannot splice */
#define ETIMEDOUT   110 /* Connection timed out */
#define ECONNREFUSED    111 /* Connection refused */
#define EHOSTDOWN   112 /* Host is down */
#define EHOSTUNREACH    113 /* No route to host */
#define EALREADY    114 /* Operation already in progress */
#define EINPROGRESS 115 /* Operation now in progress */
#define ESTALE      116 /* Stale file handle */
#define EUCLEAN     117 /* Structure needs cleaning */
#define ENOTNAM     118 /* Not a XENIX named type file */
#define ENAVAIL     119 /* No XENIX semaphores available */
#define EISNAM      120 /* Is a named type file */
#define EREMOTEIO   121 /* Remote I/O error */
#define EDQUOT      122 /* Quota exceeded */

#define ENOMEDIUM   123 /* No medium found */
#define EMEDIUMTYPE 124 /* Wrong medium type */
#define ECANCELED   125 /* Operation Canceled */
#define ENOKEY      126 /* Required key not available */
#define EKEYEXPIRED 127 /* Key has expired */
#define EKEYREVOKED 128 /* Key has been revoked */
#define EKEYREJECTED    129 /* Key was rejected by service */

/* for robust mutexes */
#define EOWNERDEAD  130 /* Owner died */
#define ENOTRECOVERABLE 131 /* State not recoverable */

#define ERFKILL     132 /* Operation not possible due to RF-kill */

#define EHWPOISON   133 /* Memory page has hardware error */

#endif

相关问题