子プロセスは、コードが生成される前にコードを実行するようです。どうやって防ぐことができますか?

子プロセスは、コードが生成される前にコードを実行するようです。どうやって防ぐことができますか?

whileループで複数の子プロセスを生成する親プロセスを持つプログラムを作成しようとしています。テストのために、4つのプロセス(1つの親プロセスと3つの子プロセス)のみを作成することから始めました。しかし、私が知っている限り、その行に戻る再帰機能がなくても、子は自分が作成した行の上でコードを実行しているようです。

これが私が今持っているものです:

int main() {

  time_t start;
  time_t end;
  int i = 0;
  pid_t pid;

  start = time(NULL);
  printf("Αρχική τιμή δευτερολέπτων %d\n", start);

  pid = fork();
  printf("%d ", pid);
  while (i < 2) {
    if (pid > 0) {
      fork();
      wait();
      i++;
    }
  }

  printf("check ");

  printf("%d", pid);

  if (pid > 0) {
    end = time(NULL);
    printf("%d\n", end - start);
  }

  return 0;
}

私の結果は次のとおりです

Αρχική τιμή δευτερολέπτων 1547394155
29338 check 29338 0
29338 check 29338 0
29338 check 29338 0
29338 check 29338 0

printf ("%d ", pid)そのため、当時は2つのプロセスしか実行しなければなりませんが、4回実行されるようです。

ベストアンサー1

これは「と関係があります。なぜfork()を使用するプログラムは時々出力を何度も印刷するのですか?」。

これにより、printf("%d ", pid)文字列が改行文字で終わらずに呼び出されないため、出力バッファはすぐにフラッシュされません。これは、フラッシュされていないバッファが子プロセスによって継承され、バッファが最後に呼び出されるときを意味します。fflush(stdout)最後に、printf()(改行文字出力)またはプログラム実行の終了時にフラッシュすると、元の親プロセスのPIDが複数回出力されます.

fflush(stdout)その呼び出しの直後に挿入するとprintf()(適切なヘッダーを含めてwait()正しく呼び出すことも含まれます)、次のような結果が得られます。

Αρχική τιμή δευτερολέπτων 1547400480
79301 0 check 793010
check 793010
check 793010
check 793010

また、ループ内で無限に繰り返されるプロセス(値が0whileの最初の子プロセス)が得られます。pid

おすすめ記事