首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查0,1,2文件描述符与ISC解决方案的最佳方法

检查0,1,2文件描述符与ISC解决方案的最佳方法
EN

Stack Overflow用户
提问于 2021-08-25 07:34:49
回答 1查看 48关注 0票数 1

ISC源代码 on 服务器目录和dhcpd项目中,我们有以下检查0、1、2个文件描述符的代码。

代码:

代码语言:javascript
复制
  /* Make sure that file descriptors 0 (stdin), 1, (stdout), and
     2 (stderr) are open. To do this, we assume that when we
     open a file the lowest available file descriptor is used. */
  fd = open ("/dev/null", O_RDWR);
  if (fd == 0)
    fd = open ("/dev/null", O_RDWR);
  if (fd == 1)
    fd = open ("/dev/null", O_RDWR);
  if (fd == 2)
    log_perror = 0; /* No sense logging to /dev/null. */
  else if (fd != -1)
    close (fd);

我不明白这代码是怎么回事。

它打开/dev/null,并将其fd号与0进行比较。

但是为什么它会从相同的/dev/null或者更确切地说是同一个文件中打开新的fd呢?

我测试了这段代码:

代码语言:javascript
复制
  int fd = open ("/dev/null", O_RDWR);

  printf ("fd: %d\n", fd);

在此代码中,输出等于3,但为什么呢?

如果这个fd总是等于3,那么会发生什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-25 07:39:19

代码就像它说的那样。

确保文件描述符0 (stdin)、1、(stdout)和2 (stderr)是打开的。为此,我们假设在打开文件时使用最低可用的文件描述符。

它尝试打开一个文件;如果它的fd为0 ( stdin ),则假定没有打开stdin句柄。如果是这样,它将继续打开fd 1 (stdout)和fd2 (stderr)。最后,如果它已经打开了fd 2 (stderr),它就可以知道它是/dev/null,并且没有浪费编写循环的意义,并相应地设置标志。

最后,如果打开的代码不是0、1或2,则fd关闭以避免泄漏未使用的fd。

我测试了这段代码

因为在这种情况下,stdin、stdout和stderr已经打开,并且得到了fd3。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68918673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档