Linuxはフォーク関数呼び出しの例の底に取得します

ここでは、Linuxオペレーティングシステム上でいくつかのforkシステムコールの使用を説明します。(定期的に更新)

A、atexit関数

無効クリーンアップ(無効){ 
    のprintf(" \ n個のクリーンアップ" ); 
} 
ボイドfork6()
{ 
    のatexit(クリーンアップ)。
   printf( "L0");
   フォーク();
   printf( "L1")。 出口(
0 ); }

結果:

 

 

    int型(無効(* FUNC)(無効))のatexitの  機能、処理を終了するが、通常のatexit funcをメソッドを呼び出すだろうというとき、あなたはどこ関数funcを書くかどうか。 

第二に、子供の回復

  プロセスが何らかの理由で終了すると、カーネルはすぐにシステムから削除されません。しかし、それが呼び出され、親プロセスのリサイクルの終了を待っている状態のままになり、「ゾンビプロセス。」親プロセスのリサイクル工程が終了したとき、カーネルは親プロセスに渡された子プロセスの状態を終了し、処理が終了した放棄されます。この時点で、プロセスは存在しません。

  親プロセスが終了した場合、カーネルは、initプロセスがそのプロセスで孤児の父で手配いたします。

  64ビット・システムでは、プロセスの養父は、一般的ではない数であるが、ランダムなプロセスの数が、このプロセスは、「/ LIB /にsystemd / systemdに--user cmdをされています   」/

  (使用したPS -efビューにコマンド)

 

   1.最初の子プロセスの終了、親プロセスがハングサイクル。息子通常の回復プロセス。

ボイドfork7()
{ 
    場合(フォーク()== 0 ){
     / * * / 
    のprintf(" 終端子、PID =%D \ n " 、GETPID())。
    出口(0 ); 
    } { 
    のprintf(" 実行親、PID =%D \ n " 、GETPID())。
    一方、1 / * 無限ループ* / 
    } 
}

   結果:

 

 

   2.親プロセスがハングアップするループに子プロセスを終了します。

ボイドfork8()
{ 
    場合(フォーク()== 0 ){ 
    睡眠(1 )。
    / * * / 
    のprintf(" 実行子供、PID =%D \ n " 、GETPID())。
    printf(" 子の実行、PPIDは%D \ N = " )(getppid)。
    一方、1 / * 無限ループ* / 
    } { 
    のprintf(" 終了親、PIDは=%D \ n " 、GETPID())。
    出口(0 ); 
    }
}

  結果:

 

   2番目のコードサンプル、実行の終了前に、子プロセスよりも親は、子供が孤児プロセスとなり、この時点では、採用されました。プロセスの養父は、先に説明しました。

  3.ここでは、子供の回復にはいくつかの参照があるという問題点があります。

INT {main()の

    INT PID1、PID2、PID3、PID4あり、PID5; 

    のprintf(" 1番は\ N-処理を開始" );
     //は、最初のプロセスのPIDを取得 
    PID1は= (GETPID); 
    のprintf(" PID1の%= D \ N- "PID1); //は、第二のプロセス作成 
    PID2 = ;フォーク()
     IF(PID2 == 0 
    { 
        のprintf(" 2つのプロセスが始まる\ N- " ); 
        のprintf(" PID2の%= Dを、PID親%D = \ N- "GETPID()、getppid()); 
        のprintf(" エンドプロセス番号2 \ N- "

    
); 

        // 終了終了 
        終了(0 ); 
    } 

    // 第三のプロセスを作成 
    PID3 = フォーク();
     IF(PID3 == 0 
    { 
        のprintf(" 番号3 N- \の処理を開始する" ); 
        のprintf(" PID 3 D%=、親D PID =%\ N- " 、GETPID()、getppid()); 

        //はプロセス3号た第4プロセス作成 
        PID4である= フォーク();
         IF(PID4は==である0 
        { 
            のprintf(4番N- \のプロセスを開始する); 
            のprintf("4 =%D PID、親PID =%D \ N- "GETPID()、getppid()); // SLEEP 3 3秒、彼は孤立なったプロセスの終了を待つ 
            SLEEP(3 ); 
            のprintf(" 第4号プロセスは終了\ N- " ); 
            終了(0 ); 
        } // 内部プロセス3、第5の作成プロセス 
        PID5 = フォーク();
         IF(PID5 == 0 
        { 
            のprintf(" PID 5%= D、親。 =%D PID \ N- "GETPID()、getppid()); 
            のprintf(" 5番処理が\ N-を開始した" ); //

            

        

            睡眠3工程3の終了のための第二のウェイトを、その孤立処理 
            SLEEP(3 ); 
            のprintf(5番処理を終了\ N- ); 
            終了(0 ); 
        } 
        // 観察PIDを容易に子プロセスの終了との間の待ち時間関係 
        のprintf(" 第3のプロセスの終了\ N- " );                 
        終了(0 ); 
    } 


    // 子スレッドの終了を待つ 
    (printfの" エンド・プロセスの第1 \ N- " );
     の戻り 0 ; 
} 
-------- -------- 
免責事項:この記事は元の記事CSDNのブロガーが「張グーグー」、フォローのCCで4.0バイ・SAの著作権契約は、再現し、元のソースのリンクと、この文を添付してください。
オリジナルリンク:HTTPS:// blog.csdn.net/Paulhappy/article/details/50984888

  次のコマンドを使用してコードをコンパイルします

$ gccの-oプロセス。アウト processes.c -lpthread

  結果は以下の通りであります:

 

   次のようにプログラムのプロセスは、次のとおりです。

 

   

おすすめ

転載: www.cnblogs.com/lyw-hunnu/p/11828768.html