2016-12-24 14 views
0

は発生しません:は、次のコードではエラー

int main(void) { 
     printf("before child\n"); 

     int pid = fork(); 

     if(pid == 0) 
     { 
       exit(0); 
     } 
     int status; 
     wait(&status); 
     if(4 != printf("abc\n")) 
       perror("printing to stdout\n"); 
     return 0; 
} 

は出力を生成します。子供に)(終了する

before child 
abc 

コールは、すべてのファイルdiscriptorsを閉じる必要がありますstdout fdを含む。 親プロセスは、閉じた後もstdoutに書き込むことができますか?

+0

printfの戻り値を確認しますが、 'fork'、' wait'のためにチェックしていませんか? –

+4

各プロセスには独自の記述子があります。子を閉じても、親の記述子は閉じられません。 – Barmar

+1

あなたは* parent *プロセスも '' abc "'を発行することを理解していますか? –

答えて

4

ファイル記述子を参照カウントファイルオブジェクトへのポインタと考えてください。

forkとすると、子プロセスはへの新しい参照を親プロセスと同じストリームに取得します。親と子の両方のディスクリプタは、同じストリームオブジェクトを指しています。

子プロセスでexitが処理されると、子プロセスのファイル記述子がすべて閉じられます。しかし親である親はストリームオブジェクトに対するファイル記述子も持っているので、ストリームは消えません。

ファイルとストリームは、もう誰も参照しなくなった場合にのみ分解されます。この場合、親プロセスはそれらを参照します。 (追加の楽しみのために、同様の方法でファイル記述子を複製され、機能のdup家族をチェックしてください。それによって、あなたは、単一のプロセスで、同じファイル用の2つのファイル記述子を持つことができます。)

+1

正式には、POSIX標準には、「オープンファイル記述子」と「オープンファイル記述子」があります。各オープンファイル記述子は単一のオープンファイル記述子を参照しますが、多くのオープンファイル記述子は、( 'dup()'や 'dup2()の後ろに)特定のオープンファイル記述子を個別に参照することができます。 'fork()'の後ろと同様に 'Tis fun ...現在の位置はオープンファイル記述のプロパティであり、close-on-exec状態はオープンファイル記述子のプロパティです。ケアが必要です! –

関連する問題