0
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
void main()
{
  int i = 1;
  pid_t child_pid;
  printf("The main program process ID is %d", (int) getpid());
  printf("%d", i);
  child_pid = fork();
  if (child_pid != 0) {
    i++;
    printf("%d", i);
    printf("This is the parent process, with ID %d \n", (int) getpid());
    printf("The child process is %d ", (int) child_pid);
  } else {
    printf("%d", i);
    printf("This is the child process, with ID %d \n", (int) getpid());
  }
}

関数を使用して、C言語を使用してこのプログラムを実行していfork()ます。私が理解しているように、プロセスが を呼び出すfork()と、子プロセスと呼ばれる複製プロセスが作成されます。親プロセスfork()は呼び出された時点から実行を継続し、子プロセスも同じプログラムを同じ場所から実行します。

したがって、プログラムを実行すると、出力は次のテキストのようになると思います。

The main program process ID is 181411This is the child process, with ID 1815
The main program process ID is 18142This is the parent process,with ID 1814
The child process is 1815

しかし、実際には次の出力が表示されます。

The main program process ID is 181411This is the child process, with ID 1815
The main program process ID is 181412This is the parent process,with ID 1814
The child process is 1815

これは、子供が最初にプログラムを実行することを意味します!!! \n各ステートメントの最後に置くとprintf、出力は正しいです!!!

Fedora v12 および rhel 5 ディストリビューションで試しました。\nと操作の間に論理的な関係はありfork()ますか? どうすればこの問題を解決できますか?

4

4 に答える 4

4

問題は、出力がラインバッファリングされ、出力するかstdoutを\n明示的に呼び出すまで、実際には画面にフラッシュされないことです。fflush(とはいえ、どのプロセスが出力を高速化するかについての保証はありません)。

于 2012-11-11T15:38:04.490 に答える
3

stdout通常、ラインバッファリングされます。したがって、。を受信すると、印刷されるテキストがコンソールにフラッシュされます'\n'

どのプロセスが最初に書き込むかは、OSによって非決定的に処理されます。

'\n'通常はバッファリングされていないため、を使用してトリガーする必要なしに印刷することstrerrはオプションです。

于 2012-11-11T15:38:11.230 に答える
0

私の経験では、stderr を fprintf(stderr,......) として使用すると、常にバッファリングされていない出力が書き込まれるように見えます。セグメント エラーで実行が停止する前に、行の内容を出力できました。stderr でもう一度試してください。

于 2012-11-12T07:15:37.427 に答える