LINUX.ORG.RU

open(«/dev/null», ...) - fake stdin/stdout/stderr?


0

0

Вчера в одной приладе увидел вот такой код с комментарием (но без 
каких-либо дополнительных разъяснений):

/* Open fake stdin, stdout, stderr - just in case */
open("/dev/null", O_RDONLY);
open("/dev/null", O_WRONLY);
open("/dev/null", O_WRONLY);

Вопрос такой: зачем такое делается? Какое отношение имеют стандартные
каналы к /dev/null? Почему не сохраняются результирующие дескрипторы?

Заранее спасибо за информацию :)

Re: open("/dev/null", ...) - fake stdin/stdout/stderr?

> /* Open fake stdin, stdout, stderr
> open("/dev/null", O_RDONLY);

надо думать, перед этим дескрипторы 0,1,2
были закрыты, иначе все это довольно бессмысленно.

но просто закрыть из небезопасно. представьте,
что вы в своем коде открываете базу данных для
записи. если дескриптор 2, к примеру был свободен,
вы можете его и получить. потом вызываете какую-то
функцию из библиотеки, а там:

fprintf(stderr, "А у меня ашипка!\n");

idle ★★★★★ ()
Ответ на: Re: open("/dev/null", ...) - fake stdin/stdout/stderr? от idle

Re: Re: open("/dev/null", ...) - fake stdin/stdout/stderr?

А, понимаю! Т.к. если 0, 1, 2 - закрыты, то немедленный open откроет три
самых первых свободных дескриптора, то есть как раз эти 0, 1, 2.
Правильно?

Большое спасибо еще раз :)

jek_ ()
Ответ на: Re: Re: open("/dev/null", ...) - fake stdin/stdout/stderr? от jek_

Re: Re: Re: open("/dev/null", ...) - fake stdin/stdout/stderr?

Вообще правильно сначала сделать open

n_stdin = open("/dev/null", O_RDONLY);
...

а затем

dup2(0, n_stdin);
...

anonymous ()

Re: open("/dev/null", ...) - fake stdin/stdout/stderr?

обычно делают

if ((fd = _open(_PATH_DEVNULL, O_RDWR, 0)) != -1) {
    dup2(fd, STDIN_FILENO);
    dup2(fd, STDOUT_FILENO);
    dup2(fd, STDERR_FILENO);
    if (fd > 2)
         close(fd);
}

что бы зафэйкать stdin/stdout/stderr

lg ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.