我对ptunnel
关闭stdin,stdout和stderr的方式很感兴趣:
if (daemonize)
{
...
freopen("/dev/null", "r", stdin);
freopen("/dev/null", "w", stdout);
freopen("/dev/null", "w", stderr);
}
这是关闭它们的好方法吗?我很困惑,因为freopen将打开一个文件描述符,在这种情况下不会关闭。
答案 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。