私は2つの実行可能ファイルを持っています-親プロセスとその子プロセスで、ロングモード(サーバーなど)で実行されています。必要なのは、子のstdoutとstderrを親のプロセスにリダイレクトし、それらをファイルに書き込むか、ttyに出力することだけです。今は関係ありません。
単純な子について話す場合、これは非常に簡単な作業ですが、部分的に出力される長期実行の子では問題になります。
たとえば、pipe
(エラーチェックやその他の重要でない部分を省略した)を使用した一般的なソリューションを見てみましょう。
parent.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
int link[2];
pid_t pid;
char str[4096];
pipe(link);
pid = fork();
if (pid == 0) {
dup2(link[1], STDOUT_FILENO);
close(link[0]);
execl("/path_to_bin/fast_child", "fast_child", (char *)0);
}
else
{
close(link[1]);
read(link[0], str, sizeof(str));
printf("Pipe contents: %s\n", str);
wait(NULL);
}
return 0;
}
fast_child.c
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
printf("I'm fast child\n");
return 0;
}
このタイプの子プロセスを優れた問題のない方法で使用して、親でstr(out | err)を取得しますが、このコードを子として使用すると、親で出力が消えるという問題が発生します。
slow_child.c
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
for (;;)
{
printf("I'm slow child\n");
sleep(1);
}
return 0;
}
私は問題解決の解決策としてソケットの使用法を考えていますが、これはそれほど効率的な方法ではなく、Unixはこれを行うためのより良いツールを提供していると確信しています(いつものように:)
ありがとうございました。