Я пишу программу C где я fork()
, exec()
, и wait()
. Я хотел бы взять вывод программы I exec'ed для записи этого в файл или буфер.
Например, если я должностное лицо ls
Я хочу записать file1 file2 etc
буферизовать/регистрировать. Я не думаю, что существует способ считать stdout, который означает, что я должен использовать канал? Существует ли общая процедура здесь, что я не смог найти?
Для отправки вывода в другой файл (я опускаю проверку ошибок, чтобы сосредоточиться на важных деталях):
if (fork() == 0)
{
// child
int fd = open(file, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
dup2(fd, 1); // make stdout go to file
dup2(fd, 2); // make stderr go to file - you may choose to not do this
// or perhaps send stderr to another file
close(fd); // fd no longer needed - the dup'ed handles are sufficient
exec(...);
}
Для отправки вывода в трубу, чтобы вы могли прочитать вывод в буфер:
int pipefd[2];
pipe(pipefd);
if (fork() == 0)
{
close(pipefd[0]); // close reading end in the child
dup2(pipefd[1], 1); // send stdout to the pipe
dup2(pipefd[1], 2); // send stderr to the pipe
close(pipefd[1]); // this descriptor is no longer needed
exec(...);
}
else
{
// parent
char buffer[1024];
close(pipefd[1]); // close the write end of the pipe in the parent
while (read(pipefd[0], buffer, sizeof(buffer)) != 0)
{
}
}
Вам нужно точно решить, что вы хотите делать, и, желательно, объяснить это немного более четко.
Если вы знаете, в какой файл вы хотите переместить вывод выполненной команды, тогда:
Если вы хотите, чтобы родитель считывал вывод дочернего элемента, организуйте, чтобы дочерний элемент передавал свой вывод обратно родителю.
Поскольку похоже, что вы собираетесь использовать это в среде linux / cygwin, вы хотите использовать popen . Это похоже на открытие файла, только вы получите исполняемые программы stdout
, так что вы можете использовать свои обычные fscanf
, fread
и т. Д.
После форка используйте dup2(2)
для дублирования FD файла в FD stdout, затем выполните.