什么时候打开(2)失败了errno == EMLINK?

jus*_*ody 6 c posix freebsd errno

我偶然发现了一些代码

int fd = open(fn, flags, 0);
if (fd < 0 && errno != EMLINK)
  ...
Run Code Online (Sandbox Code Playgroud)

flagsO_RDONLY或者O_RDONLY|O_NOFOLLOW

IEEE Std 1003.1,2013(SUSv4)刚刚发布

  • [EMLINK]链接太多.尝试使单个文件的链接数超过{LINK_MAX}.

  • {LINK_MAX}指向单个文件的最大链接数.

如何打开文件增加其链接数?

Nic*_*son 5

好问题.当O_NOFOLLOW加入,他们选择了重用现有的错误代码,而不是组成一个新的.EMLINK在这种情况下表示该文件是符号链接并在FreeBSD上返回.当NetBSD使用时,Linux和Darwin返回ELOOP而不是.EMLINKEFTYPE

我的联机帮助页说O_NOFOLLOW是随后添加到Linux的FreeBSD扩展(即你不会在旧版本的SUS中找到它的行为,但它包含在带有Linux返回码的POSIX 2008中).

  • @NicholasWilson你可能已经得到了一个downvote因为'O_NOFOLLOW`*被指定为'open(2)`:http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html(它说'errno`是设置为'ELOOP`然后). (2认同)