为什么ENOENT表示“找不到文件或目录”?

710

ENOENT中的ENT是什么意思?

为什么错误信息不应该只用ENOFILE表示“没有这个文件或目录”?

这个命名有什么背景或原因吗?

4个回答

1112

ENOENT是Error NO ENTry(或Error NO ENTity)的缩写,实际上可以用于除文件和目录之外的其他内容。

这个缩写是因为在很久以前C编译器不支持超过8个字符的符号而被缩写。


59
“can actually be used for more than files/directories.” 的意思是“实际上它可以用于更多的东西,不仅限于文件/目录。”但这种情况不适用于想将代码合并到Linux内核中的情况:https://lkml.org/lkml/2012/12/23/75 - Armen Michaeli
16
如果明确指出错误而不是节省8个字符的空间,对用户来说似乎会更有价值。你知道为什么会这样吗? - Brady Dowling
78
因为在计算机编译器刚问世的时候,C语言编译器只支持使用不超过8个字符的符号。 - Some programmer dude
21
@Someprogrammerdude的评论解答了我对于C语言命名规范的大部分疑虑。 - Jackson
10
这个答案声称它可以用于“更多事情”。具体是哪些其他事情? - Jackson
显示剩余7条评论

147

这只是“没有此目录条目”。因为目录条目可以是目录或文件(或符号链接、套接字、管道或设备),所以名称ENOFILE的含义过于狭隘了。


43
符号链接、套接字、管道和设备都是文件,目录也是��件。ENOFILE 的含义与 ENOENT 一样广泛或狭窄。 - Guido Flohr
10
无论如何,可以确定的是,在 ENOENT 中,“ent”代表的意思与在 struct dirent 中相同。 - Steve Summit

9

要获取所有错误代码的完整列表以及更好的描述每个代码的含义,请参见 errno.h。 这是 C 标准库的一个包含文件,其中的注释可以澄清错误的含义。 在这种情况下:

#define ENOENT 2 /* 没有该文件或目录 */



1

在Linux(Ubuntu)中

File: /usr/include/asm-generic/errno-base.h
6: #define  ENOENT       2  /* No such file or directory */
7: 

https://man7.org/linux/man-pages/man3/errno.3.html

errno 2

返回:

ENOENT 2 No such file or directory

开放式组:

[ENOENT]
没有这样的文件或目录。指定路径名的某个组件不存在,或者路径名是一个空字符串。

https://pubs.opengroup.org/onlinepubs/009604599/functions/xsh_chap02_03.html(原文链接)

Glibc:
https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html

Macro: int ENOENT

"No such file or directory." This is a “file doesn’t exist” error for ordinary files that are referenced in contexts where they are

expected to already exist.


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