在ISC源代码 on 服务器目录和dhcpd项目中,我们有以下检查0、1、2个文件描述符的代码。
/* 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呢?
我测试了这段代码:
int fd = open ("/dev/null", O_RDWR);
printf ("fd: %d\n", fd);在此代码中,输出等于3,但为什么呢?
如果这个fd总是等于3,那么会发生什么呢?
发布于 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。
https://stackoverflow.com/questions/68918673
复制相似问题