0

私は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はこれを行うためのより良いツールを提供していると確信しています(いつものように:)

ありがとうございました。

4

1 に答える 1

3

時々子から出力をフラッシュする必要があります。そうしないと、親タスクは何も見えません。fflush(stdout)適切なポイントで使用します。または、stdout のバッファリングをオフにすることもできますが、書き込まれた文字ごとにシステム コールが実行されるため、子供のパフォーマンスに影響を与える可能性があります。

于 2012-08-28T12:13:00.673 に答える