strerror 描述字符串

11

C函数strerror返回一个错误描述字符串,详情请参见这里。例如的字符串:

没有这样的文件或目录

问题是这些字符串在哪里定义?我查看了我的头文件,但没有看到任何东西。

4个回答

8

包含错误信息的头文件名为errmsg.h

00012 const char *const sys_errlist[] = {
00013         "Operation succeeded",        /* 0 */
00014         "Invalid argument",           /* EINVAL */
00015         "Bad memory address",         /* EFAULT */
00016         "String too long",            /* ENAMETOOLONG */
00017         "Out of memory",              /* ENOMEM */
00018         "Input/output error",         /* EIO */
00019         "No such file or directory",  /* ENOENT */
00020         "Not a directory",            /* ENOTDIR */
00021         "Is a directory",             /* EISDIR */
00022         "File or object exists",      /* EEXIST */
00023         "Cross-device link",          /* EXDEV */
00024         "Try again later",            /* EAGAIN */
00025         "Illegal seek",               /* ESPIPE */
00026         "Unimplemented feature",      /* EUNIMP */
00027         "Device not available",       /* ENXIO */
00028         "No such device",             /* ENODEV */
00029         "Device or resource busy",    /* EBUSY */
00030         "Invalid/inappropriate ioctl",/* EIOCTL (ENOTTY in Unix) */
00031         "Directory not empty",        /* ENOTEMPTY */
00032         "Result too large",           /* ERANGE */
00033         "No space left on device",    /* ENOSPC */
00034         "Too many open files",        /* EMFILE */
00035         "Too many open files in system",/* ENFILE */
00036         "No such system call",        /* ENOSYS */
00037         "File is not executable",     /* ENOEXEC */
00038         "Argument list too long",     /* E2BIG */
00039         "Bad file number",            /* EBADF */
00040 };

正如您所看到的,它取决于libc实现。但是一般思路是相同的:某些数组包含从错误编号到字符串最大长度为1024字节的映射。

其他实现:


离题了。第二个链接的实现有多复杂? - Jack
1
除了最后一个链接外,你所有的信息似乎都来自学生的操作系统项目。 - Fred Foo

7
它们在C库的某个地方定义,传统上在全局char*数组sys_errlist中,长度为sys_nerr,至少在Unix系统上是这样的。因为早于strerror标准化的遗留程序可能直接访问该数组,所以即使在现代GNU / Linux和Mac OS X上也仍然可用以实现向后兼容性(但除非通过perrorstrerror访问,否则不应直接访问它)。例如,这里是Mac OS X 10.8.2对sys_errlist的定义

2

它们通常被定义并嵌入在您的 C 运行时库中,例如在大多数类 Unix 系统上的 libc。


2

在典型的库中,它们至少会存在一个目标文件中,该文件会被链接到代码中 -- 通常是strerror.o(或者.obj等)。如果你对此足够关注,那么只需在库的源代码中进行一些关键字搜索即可找到它们。


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