关闭stdin stdout和stderr ptunnel方式

时间:2013-05-18 18:23:38

标签: c stdout stdin file-descriptor

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

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

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

1 个答案:

答案 0 :(得分:2)

没有。这不完全安全。

它假定freopen()重用相同的文件描述符,这是不能保证的。因此,如果freopen()使用不同的文件描述符,比如说stdout而不是1,那么使用该文件描述符的后续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和&amp;分别为2,或者您没有使用可能不正确的文件描述符执行任何IO。