0

ptunnel我对关闭 stdin、stdout 和 stderr的方式很感兴趣:

if (daemonize)
{
    ...
    freopen("/dev/null", "r", stdin);
    freopen("/dev/null", "w", stdout);
    freopen("/dev/null", "w", stderr);
}

这是关闭它们的好方法吗?我很困惑,因为 freopen 会打开一个文件描述符,在这种情况下不会关闭。

4

1 回答 1

2

不,这并不完全安全。

它假设 freopen() 重用相同的文件描述符,这是不保证的。因此,如果 freopen() 使用不同的文件描述符,例如,除此之外,stdout1后续write()使用该文件描述符的操作将无法按预期工作。因为 POSIX 读/写函数使用*_FILENO定义为:

/* Standard file descriptors.  */
#define STDIN_FILENO    0       /* Standard input.  */
#define STDOUT_FILENO   1       /* Standard output.  */
#define STDERR_FILENO   2       /* Standard error output.  */

用于各自的 IO 操作。

相反,你可以这样做:

#include<unistd.h>

  fd = open("/dev/null",O_RDWR);
  dup2(fd,0);
  dup2(fd,1);
  dup2(fd,2); 

达到同样的效果。明显的缺点是open()dup2()是 POSIX 函数,不是 C 标准的一部分。

但是,只要分别freopen()重用文件描述符 0、1 和 2,或者您不对可能不正确的文件描述符执行任何 IO,您就是安全的。

于 2013-05-18T19:20:08.223 回答