ここでは、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
結果は以下の通りであります:
次のようにプログラムのプロセスは、次のとおりです。