检查 0、1、2 文件描述符与 ISC 解决方案的最佳方法
Best way for checking 0, 1, 2 file descriptors vs ISC solution
在 ISC source code on server directory 和 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,那会发生什么?
代码完全按照它所说的去做。
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 是 0 (stdin),则假定没有打开 stdin 句柄。如果是这样,它将继续打开 fd 1 (stdout) 和 fd 2 (stderr)。最后,如果它打开了 fd 2 (stderr),它可以知道它是 /dev/null
并且没有必要浪费周期写在那里,并相应地设置标志。
最后,如果代码打开的 fds 不是 0、1 或 2,则关闭 fd 以避免泄漏未使用的 fd。
I tested this code : [...]
因为在那种情况下,stdin、stdout 和 stderr 已经打开并且您得到了 fd 3。
在 ISC source code on server directory 和 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,那会发生什么?
代码完全按照它所说的去做。
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 是 0 (stdin),则假定没有打开 stdin 句柄。如果是这样,它将继续打开 fd 1 (stdout) 和 fd 2 (stderr)。最后,如果它打开了 fd 2 (stderr),它可以知道它是 /dev/null
并且没有必要浪费周期写在那里,并相应地设置标志。
最后,如果代码打开的 fds 不是 0、1 或 2,则关闭 fd 以避免泄漏未使用的 fd。
I tested this code : [...]
因为在那种情况下,stdin、stdout 和 stderr 已经打开并且您得到了 fd 3。