2017-11-08 10 views
1

私はプロセスの操作方法を正確に理解しようとしています。具体的には、実行されるコードと実行されないコード。私は理解していないことを試して説明するためにいくつかのサンプルコードを書いた。Cのプロセス:fork()scope

int main(){ 

    //Program code part 1 

    int myfun(){ 
    if(fork()>0){ 

     //Program code part 2 

    } 
    return 0; 
    } 
    //Program code part 3 

} 

私が理解していることから、親プロセスはコードパート1と3を実行し、myfun()に0を返します。子はパート2を実行する必要があります.1ではなくなります。パート3を実行しますか? myfun()のスコープで作成されているので、私は思っていませんでしたが、私は自分のプログラムを乱す前に確かに確認したいと思います。

+0

'myfun'は' main'の内部で定義されています。私はgccがこれをサポートする拡張機能を持っていると信じていますが(標準ではありません)、あなたは決してその機能を呼び出すことはありません。 – Kevin

+1

あなたは 'main'の中に' myfun' *を定義しました。あなたはCでそれを行うことはできません。 'main'は' myfun'を呼び出しますか? –

+0

Cでは、ネストされた関数定義を許可していません。 – PSkocik

答えて

3

成功したforkは、>0 pidの子で1回、0の子を1回返します。両方とも、その時点から継続します。

制御フローに関する限り、これだけです。

は、あなたのコードがある場合:

int myfun() 
{ 
    if(fork()>0){ 
     //Program code part 2 
    } 
    return 0; 
} 
int main() 
{ 
    //Program code part 1 
    myfun(); 
    //Program code part 3 
    return 0; 

} 

は、親がパート2を実行するとfork()呼び出しが-1で失敗しましたしない限り、親と子の両方が(パート3を実行しますが、その場合には子がありません)。

子を制限したい場合は、終了する場所で_exit(SomeExitCode)を実行します。後者fflush ES stdioは ストリームとatexitハンドラを呼び出し、このすべてが そのファイル記述子と親から複製処理画像を有する子に望ましくない可能性があるとして

_exitは、フォーク状プロセスにおいてexitにわたって一般的に好ましいです)

関連する問題