Я смущен тем, что popen() перенаправляет stdin, stdout и stderr дочернего процесса в unix. Страница man на popen() не очень понятна в этом отношении. Вызов
FILE *p = popen("/usr/bin/foo", "w");
создает дочерний процесс и выполняет оболочку с аргументами "-c", "/usr/bin/foo" и перенаправляет stdin этой оболочки (которая перенаправляется stdin из foo), stdout на p. Но что происходит с stderr? Каков общий принцип этого?
Я заметил, что если я открою файл в foo (используя fopen, socket, accept и т.д.), а родительский процесс не имеет stdout, ему будет присвоен следующий доступный номер файла, который равен 1 и так далее. Это дает неожиданные результаты из таких вызовов, как fprintf (stderr,...).
Этого можно избежать, написав
FILE *p = popen("/usr/bin/foo 2>/dev/null", "w");
в родительской программе, но являются ли их лучшими способами?