Возвращаемое значение из popen () - это обычный стандартный поток ввода-вывода во всех
с уважением, за исключением того, что он должен быть закрыт с помощью pclose (), а не
fclose (3). Запись в такой поток пишет на стандартный ввод
команда; стандартный вывод команды такой же, как
процесс, который вызвал popen (), если это не изменено командой
сам. И наоборот, чтение из «всплывающего» потока читает
стандартный вывод команды, а стандартный ввод команды
такой же, как у процесса, который вызвал popen ().
С его man-страницы, поэтому он позволяет читать стандартный вывод команд или записывать в его стандартный ввод. Это ничего не говорит о stderr. Таким образом, это не перенаправлено.
Если вы укажете «w», вы отправите свои данные на стандартный ввод исполняемой оболочки. Таким образом, делая
FILE * file = popen("/bin/cat", "w");
fwrite("hello", 5, file);
pclose(file);
Заставит оболочку выполнить / bin / cat и передать ей строку "hello"
в качестве стандартного входного потока. Если вы хотите перенаправить, например, stderr в файл "foo"
, сделайте это сначала, прежде чем выполнить приведенный выше код:
FILE * error_file = fopen("foo", "w+");
if(error_file) {
dup2(fileno(error_file), 2);
fclose(error_file);
}
Он откроет файл и продублирует свой дескриптор файла до 2, после чего закроет исходный дескриптор файла.
Теперь, если у вас есть закрытый stdout в вашем родителе, то если ребенок вызывает open
, он получит 1, поскольку это (если stdin уже открыт) следующий свободный дескриптор файла. Единственное решение, которое я вижу, состоит в том, чтобы просто использовать dup2 и дублировать что-то в родительский объект, как в приведенном выше коде. Обратите внимание, что если дочерний элемент откроет stdout
, он не сделает stdout
открытым также в родительском элементе. Он там закрыт.