2013-05-18 3 views
0

Я был заинтригован, кстати ptunnel закрывает стандартный ввод, стандартный вывод и стандартный поток ошибок:Закрытие STDIN стандартный вывод и стандартный вывод в Ptunnel путь

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

Это хороший способ, чтобы закрыть их? Я запутался, потому что freopen откроет файловый дескриптор, который не закрыт в этом случае.

ответ

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

для соответствующих операций ввода-вывода.

Вместо этого вы могли бы сделать:

#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 с потенциально некорректными файловыми дескрипторами.

Смежные вопросы