繁体   English   中英

关闭stdin stdout和stderr ptunnel方式

[英]Closing stdin stdout and stderr the ptunnel way

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

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

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

不,这不完全安全。

它假定freopen()重用相同的文件描述符,这是不能保证的。 因此,如果freopen()使用不同的文件描述符,例如,对于除1之外的stdout那么使用该文件描述符的后续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,你就是安全的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM