2016-10-12 8 views
0

フォークの後にプロセスのIDを表示する2行のプログラムがあります。親プロセスの場合は66015、子プロセスの場合は0などの数字が必要です。2行プログラムでフォークした後にprintfを1回だけ印刷する

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main() { 
    pid_t id = fork(); 
    printf("id: %i\n", id); 
} 

プログラムのみ

id: 66015 

を出力し、行が含まれていません。しかし

id: 0 

誰かが何が起こっているのかを説明してもらえますか?私は比較的新しいCforkです。

私はOSX 10.11上だし、gcc --versionプリント

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 8.0.0 (clang-800.0.38) 
Target: x86_64-apple-darwin15.6.0 
Thread model: posix 
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 
+0

あなたはどのようなシステムをコンパイルしていますか?あなたのコードはOS/Xで期待通りに動作します – chqrlie

+0

私はOSX 10.11です。詳細については詳しく説明します。 – m0meni

+0

10.11.6を若干古いバージョンのLLVM(7.0.0)で実行していて、コードが期待どおりに動作します。 – chqrlie

答えて

2

あなたのプログラムは、任意の順序で出力両方の線を確かにする必要があります。ターミナルでそれを実行することはそうするでしょう。 emacsのeshellウィンドウのような気まぐれな環境で実行すると、経験したような驚くべき副作用が生じるかもしれません。

+0

助けてくれてありがとう!できれば受け入れます。 – m0meni

+0

私はいくつかのIDEがデバッグ目的のために独自のライブラリを提供していると思います。それは、valgrindがIDE以外の独自のライブラリを提供するのと同じです。それらの提供されたライブラリには完全な飛ばしfork()がないかもしれません。 – alvits

+1

@alvits:emacsはライブラリを提供せず、clangによってコンパイルされたプログラムを実行しますが、出力をキャプチャする方法は、ターミナルウィンドウでの動作とは異なります。それはバグとみなされるべきです。 – chqrlie

関連する問題