私は子プロセスを生成するアプリケーションを持っています。その子プロセスは、stdoutに印刷することによって、何をしているのかに関する情報を出力します。親プロセスは同じことをする(すなわち、標準出力に出力する)。子プロセスコンソール出力を先頭に追加
子プロセスでは、いくつかのテキストを前置してstdoutに書き込むことができますが、多くのソースファイルにまたがって印刷するすべての単一の場所に追加する必要があります。
私は、親プロセスが子プロセスからfork/execの出力をprependすることが賢明かもしれないと考えました。親プロセスとインラインで出力するのが有益なので、出力をリダイレクトしたくありません。これはどうすればいいですか?親でfork/execを使用しています。
出力を読み、手動で各行を追加する必要がありますか、より簡単な方法がありますか?
更新: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(" prepend "); printf' – Riley