ネットワークプログラミング(32) - ゾンビの破壊の過程でLinuxの4つの方法

、待っ機能


関数のプロトタイプ:
待ち時間(int型*ステータス)pid_t;
説明:
待機は、ゾンビプロセスのいずれかを回復することができます限り、一回待つと呼ばれるゾンビプロセスシステムがあるとして、回復はゾンビプロセスになります。
パラメータ説明:
  ステータス-子プロセスの終了は、それがゾンビ状態に入ります。そのオペレーティングシステムの状態変化情報は、メモリ内の特定の位置に配置され、ポインタが位置にある状態では、位置データのこの部分は、機能待機を呼び出すことによって得ることができます。
データを取得した後、あなたは一連のマクロを介してシステムの現在の動作状態を取得することができます。例えば:
WIFEXITED(*ステータス)プロセスは、(リターンまたは出口の端部を通る主な機能)が正常に終了したか否かを決定することができ、通常の終了場合はfalse、trueを返します。
WEXITSTATUSは(*ステータス)真WIFEXITED(ステータス)を返す提供処理が正常に完了したときのメイン関数の戻り値を取得するために使用されます。
戻り値:
終了ゾンビプロセスのプロセスIDを返します。
例:
int型のmain()
{
    pid_t PID;
    INTステータス、
    PIDは、(フォーク=);
    IF(PID == 0)
    {
        出口(10);
    }
    他
    {
        PIDがウェイト(&ステータス)=。
        IF(WIFEXITED(ステータス))
        {
            のprintf( "プロセス%D終了、戻り値=%d個の\ n"、PID、WEXITSTATUS(ステータス))。
        }
    }
    0を返します。
}


欠点:
待つ()関数は、そのオペレーティングシステムがないゾンビプロセスでない場合、プログラムはゾンビプロセスまでに)(待ちで待機すると言うことで、ブロッキング機能です。


二、waitpidの機能


関数プロトタイプ:
(オプションint型のpid pid_t、ステータスはint *)pid_t waitpidのは;
説明:
waitpidの()(ゾンビを回復し、待つために使用されている)異なる、それは非ブロックされる関数である回復したPIDパラメータを設定することで指定することができますゾンビプロセスのプロセスID、あなたはまた、すべてのゾンビ回復プロセスを指定することができます。
パラメータ:
ステータス、および待機()関数は同じです。
-1に設定されている場合、PID、、、リサイクルするために任意のデフォルトゾンビプロセスの回復をプロセスのプロセスIDを指定します。
オプション、設定オプション、通常の状況下ではWNOHANGに設定されている、彼らは詰まらなかったと述べました。
戻り値
がゾンビ場合、プロセスはゾンビプロセスIDを終了し返し、エラーが発生した場合は-1; 0ゾンビが場合を返す。
例:
int型のmain()
{
    pid_t PID;
    INTステータス、
    PIDは、(フォーク= );
    IF(PID == 0)
    {
        SLEEP(10)、
        出口(10);
    }
    他
    {
        一方((PID = waitpidを(-1、&ステータス、WNOHANG))== 0)
        {
            プット( "... wating");
            睡眠(2)。
        }
        (WIFEXITED(ステータス))なら
        、{
            のprintf( "プロセス%D終了、戻り値=%d個の\ n"、PID、WEXITSTATUS(ステータス))。
        }
    }
    0を返します。
}


短所:
のwaitpid()関数の代わりにブロッキングが、しかし、コードを使用する場合、ループのみ回復ゾンビが完了した後に行われた後、ループ内で使用する必要があります。


3つの信号機能


関数プロトタイプ:
シグナル(ハンドラはsighandler_t、シグナムをINT)はsighandler_t;
説明:
システム・レベルのAPIは、オペレーティングシステム及び信号処理機能登録信号、捕捉信号のオペレーティングシステムは、登録信号ハンドラを呼び出します。
パラメータ:
シグナム、信号が子プロセス信号を終了するために登録されているSIGCHLDです。
ハンドラハンドラ、信号、フォームのボイドハンドラで一般関数プロトタイプSIG(INT)、信号のオペレーティングシステムの取得に関数のパラメータ、関数の戻り値がvoid
戻り値:
信号処理関数が戻る前に登録された信号を処理関数ポインタ。
例えば:
ボイドsig_handling(INT SIG)
{
    int型の状態;
    pid_t PID;
    IF(SIG SIGCHLD ==)
    {
        PID = waitpidを(-1、&ステータス、WNOHANG);
        IF(WIFEXITED(ステータス))
        {
            のprintf(「%のDプロセス終了しました、戻り値D =%\ N-」、PID、WEXITSTATUS(ステータス));
        }
    }
}
 
 
メインINT()
{
    pid_tのPID。
    信号(SIGCHLD、sig_handling)。
    PID =フォーク()。
    IF(PID == 0)
    {
        出口(11)。
    }
    他
    {
        睡眠(10000)。
    }
    0を返します。
}


  注:
  1、信号処理機能sig_handlingをするだけでなく、ゾンビプロセスを回復するために)(waitpidを使用する必要があり、それ自体が機能ゾンビを回復しない信号の登録、わずか信号の役割です。
  本当に睡眠、中断され、信号は、スリープ()状態の処理の終了を発生すると、その親プロセスの睡眠(10000)であり、信号の登録及び信号処理機能を有する信号一旦2、万秒。
 
四つのsigaction関数


関数プロトタイプ
は、sigaction INT(シグナム、はsigaction行為*構造体CONST、int型
                     *はsigaction oldact構造体を)
説明:
シグナム、同じ信号、登録する必要性を示す信号。
次のように行為、ポインタのはsigaction型は、はsigactionタイプが定義されます。

{はsigactionストラクト
               、ボイド(*はsa_handler)(int)を
               空隙(* sa_sigactionのため)(INT、のsiginfo_t *、ボイド*);
               sigset_tはsa_maskある
               INT sa_flags;
               ボイド(*はsa_restorer)(ボイド);
           };
  我々だけ使用する場合ゼロに直接割り当てsa_flags、ブランクのはsa_handler、sa_mask、sa_flags 3つの部材はsa_handler信号処理機能、sa_mask使用sigemptyset()関数を満たす必要があります。
  ポインタのoldact、あらかじめ登録されたのsigactionタイプ。
戻り値:
  成功した場合に0を返し、-1失敗
例:
ボイドsig_handling(INT SIG)
{
    int型の状態;
    pid_t PID;
    IF(SIG SIGCHLD ==)
    {
        PID = waitpidを(-1、&ステータス、WNOHANG);
        IF(WIFEXITED(状態))
        {
            のprintf( "プロセス%dが終了し、戻り値は=%d個の\ n"、PID、WEXITSTATUS(ステータス))。
        }
    }
}
 
 
int型のmain()
{
    pid_tのPID。
    、sigaction構造体の行為。
    act.sa_handler = sig_handling。
    sigemptyset(&act.sa_mask)。
    act.sa_flags = 0;
    sigaction(SIGCHLD、&行為、0);
    PID =フォーク()。
    IF(PID == 0)
    {
        出口(11)。
    }
    他
    {
        睡眠(10000)。
    }
    0を返します。
}


  面倒いえ信号、は、sigaction関数と比較して、彼の強さは、Linuxシステムの互換性の複数のバージョンにある、およびLinuxの一部のバージョンは、信号関数によってサポートされておらず、実際の使用における使用のは、sigactionの従ってより広い範囲。

githubの位置:
https://github.com/HymanLiuTS/NetDevelopment
プロジェクトのクローニング:
Gitはクローン[email protected]:HymanLiuTS / NetDevelopment.git
本明細書中のソースコードを取得する:
GitのチェックアウトNL32
----------- ---------- 
著者:HymanLiuTSの 
ソース:CSDNの 
元ます。https://blog.csdn.net/hyman_c/article/details/53512999 
著作権:この記事はブロガーのオリジナルの記事、再現され、ボーエンを添付してくださいリンク!

おすすめ

転載: blog.csdn.net/ai2000ai/article/details/94384638