1

端末で直接実行した場合と、その出力がファイルにリダイレクトされた場合に、異なる出力を提供するテストコードに出くわしました。

# include <stdio.h>
# include <stdlib.h>
int main()
{
     printf("hello\n");
     if(fork() ==0)
     {
            printf("world\n");
     }
}

ターミナルでの出力は次のとおりです。

abhi@ubuntu:~/Desktop/ad/A1/CC$ ./vb
hello
abhi@ubuntu:~/Desktop/ad/A1/CC$ world

(ワールドを印刷した後もカーソルは点滅し続け、Enterキーを押すと通常のプロンプトが表示されます。)

出力をファイルにリダイレクトする場合:

./vb >v.txt
 abhi@ubuntu:~/Desktop/ad/A1/CC$ cat v.txt 
 hello
 hello
 world

親が子を待っていないことを私が理解している限り、それは印刷してhello返されます。次に、子は印刷worldし、コードを終了する必要があります。

私が理解できないのは、出力がリダイレクトされたときにコードが異なる動作をする理由です。これの原因は何ですか?

4

1 に答える 1

8

stdoutがファイルにリダイレクトされるとき、それはラインバッファリングされません。ttyの場合はそうです。したがって、ttyprintfに書き込むと、すぐにstdoutに書き込み、「彼女が書き込んだのはそれだけです」。

ただし、stdoutがファイルにリダイレクトされると、バッファ"hello\n"に残ります。stdioするとfork、両方のプロセス(子と親の両方)にstdioバッファーのコピーが作成され、終了時にフラッシュされます。


オフトピック:私の意見o/pでは、「出力」を書くのは本当に悪い方法です-私は千の太陽の白熱した強さでそれを嫌います。

于 2012-05-30T18:54:58.667 に答える