У меня есть приложение, которое порождает дочерний процесс. Этот дочерний процесс выводит информацию о том, что он делает, печатая на stdout. Родительский процесс делает то же самое (например, prints to stdout).Подготовить выход консольного дочернего процесса
В дочернем процессе я могу написать в stdout с некоторым добавленным текстом, но я должен добавить это ко всем местам, которые я печатаю во многих исходных файлах.
Я думал, что было бы разумнее иметь родительский процесс, чтобы получить выход из дочернего процесса, что он forks/exec. Я не хочу перенаправлять вывод, потому что просмотр вывода inline с родительским процессом является полезным. Как мне это сделать? Я использую fork/exec в родительском.
Должен ли я читать выходные данные и добавлять каждую строку вручную или есть более простой подход?
Update:
Благодаря Barmar. Вот как я это делаю. Я также мог читать байты по байтам в родительском процессе из канала до конца строки. Но я решил не использовать этот подход по причинам сложности в моем однопоточном приложении lua + C.
// Crude example of output filtering using sed to
// prepend child process output text
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <libgen.h>
#include <string.h>
pid_t spawn(int fd[2], const char* path)
{
printf("Create child\n");
pid_t pid = fork();
switch(pid){
case -1:
printf("Create process failed");
return -1;
case 0:
dup2(fd[1], STDOUT_FILENO);
close(fd[0]);
close(fd[1]);
execl(path, path, NULL);
return 0;
default:
return pid;
}
}
pid_t spawnOutputFilter(int fd[2])
{
printf("Create sed\n");
pid_t pid = fork();
switch(pid){
case -1:
printf("Create sed failed");
return -1;
case 0:
dup2(fd[0], STDIN_FILENO);
close(fd[0]);
close(fd[1]);
execlp("sed", "sed", "s/^/Engine: /", (char *)NULL);
return -1;
default:
return pid;
}
}
int main(int argc, char* argv[])
{
if (argc > 1){
int options;
int fd[2];
pipe(fd);
pid_t pid = spawn(fd, argv[1]);
pid_t sed_pid = spawnOutputFilter(fd);
close(fd[0]);
close(fd[1]);
waitpid(pid, NULL, 0);
waitpid(sed_pid, NULL, 0);
}
return 0;
}
В зависимости от того, как вы структурируете свой код, вы можете сделать что-то вроде этого: '#define printf printf (" preend "); printf' – Riley