检查 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 文件描述符的代码。

code:

  /* 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。