teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

誤字修正

2021/07/20 15:42

投稿

segavvy
segavvy

スコア1038

answer CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  ** ※実装依存の部分なので、お使いの環境によって挙動が異なる可能性があります。`man` などで確認をお願いします! **
5
5
 
6
- (1)`fork()`すると標準出力も子プロセスに渡りますが、その子プロセス終了する際渡された標準出力をフラッシュ&クローズするため、`fork()` 前にまだフラッシュしていない情報があると出力が重複してしまうことがあります。子プロセスを`_exit()`で終了するとこの処理が省かれるため、重複した出力が防げます。
6
+ (1)`fork()`すると標準出力も子プロセスに渡りますが、その子プロセス終了に渡された標準出力をフラッシュ&クローズするため、`fork()` 前にまだフラッシュしていない情報があると出力が重複してしまうことがあります。子プロセスを`_exit()`で終了するとこの処理が省かれるため、重複した出力が防げます。
7
7
  なお、このパターンの場合は`fork()`の前に`fflush(stdout)`でフラッシュしておくことでも回避できるかと思います。
8
8
 
9
9
  (2)`fgets()`を使う場合、`fork()`すると`stdin`の読み込み位置が初期化されてしまうことがあるようです。その結果、何度も繰り返し同じ行を読んでしまって出力が重複してしまうことがあります。英語ですが、Stack Overflowで近い現象のQAがありました。→[Reading input using fgets returns duplicate lines in C](https://stackoverflow.com/questions/44016803/reading-input-using-fgets-returns-duplicate-lines-in-c)