そして、プロセス間通信(2)

1プロセスを作成します。

次のようにフォーク新しいプロセスを作成する()関数で、プロトタイプは次のとおりです。

する#include <unistd.h>
pid_tフォーク(ボイド)。

フォーク()関数の実行中のプロセスが別の子プロセスをオフに分割し、それを経由して、親プロセスの子プロセスのコピーを作成します。子どもと親プロセスは、同じコード空間、ファイル記述子、およびその他のリソースを持っています

 

 

プロセスを作成するフォーク()関数、成功した場合、親プロセスのPIDに子プロセスを返す、親と子へのたびに返され、子プロセスは0を返し、エラーコードを返す失敗はゼロ未満です。

する#include <stdio.hに>
する#include <unistd.h>
の#include <STDLIB.H>
int型のmain(int型ARGC、CHAR * ARGV []){
pid_t PID;
PID =フォーク(); / *作成プロセス* /
IF (PID == 0){/ *子プロセスは0 /返す
/ *印刷;のprintf( "子がここにある、マイ%D = PID、PID =親APOS%D \ N-"、GETPID()、getppid())を息子は、PID * /処理
終了(0);
}そうIF(PID> 0){/ *親プロセスがサブプロセスをPIDの* /戻り
のprintf(「ここでは親であり、マイPID =%のD、子APOSをPID =%D \ N- 」、()、PID)GETPID;
他{/ * *フォークエラー} /

perrorは( "フォークエラーの\ n");
}
0を返します。
}

2プロセスを終了:正常終了と二つのカテゴリーの異常終了に分けます。

正常終了方法:

L()関数は、主からのリターンを返し、
Lコールタイプ出口()関数。

異常終了方法は以下のとおりです。

呼び出しLは()関数を中止;
lは終了信号を受信します。

出口関数は処理を終了するリターン命令の戻り()関数を使用する場合、メイン()単独でクラスを呼び出します。異常に中断終了()関数はSIGABRT信号によって実現されます。

通常のシェルで、あなたは$を使用することができますか?変数のプログラムの最後の実行の終了ステータスを取得します。「$エコー?」を使用し、コマンドをプログラムの状態が出て取得するには、実行成功を示し、0の値に

3のexec関数ファミリ

呼び出し元プロセスのプログラムの実行を交換する機能のexecの家族。

 

 

プロセスを作成していない機能の幹部の家族を呼び出し、そのIDは前に変更されず、処理後、幹部はちょうど新しいプログラムでプログラムの実装の現在のプロセスを交換します。

グループのexec関数は次のように、関数のプロトタイプは、六つの異なるexec関数があります。
書式#include <unistd.h>
;にextern char型** ENVIRON
EXECL INT(のconst char型*パス、CONSTのchar *のArg、...);
int型のexeclp(ファイル*チャーCONST、のArgのconst char型*、...);
int型execle(CONSTのchar *パス、CONSTのchar *のArg、...、CONSTのchar * envpを[]);
intはEXECVする(CONSTのchar *パスチャー* ARGVのCONST []);
int型execvpの(ファイルのconstのchar *、CONSTのchar * ARGV []);
int型execvpe(ファイルCONSTチャー*、CONSTのchar * argvの[]、チャーCONST * envpを[])。

 

接尾辞P- :、引数として表示ファイル名を「/」の場合、パス名とみなされ、またはのexeclpとして、PATH環境変数で指定された各ディレクトリ内の実行可能ファイルを検索()関数のファイル名。いいえサフィックスPは、EXECL()関数のように、実行可能ファイルパスの場所の名前を指定するために使用されません。

サフィックスEは:環境文字列のポインタ配列を渡すポインタを表し、NULLは、アレイは、execvpe()関数のように、環境を必要と終了しました。そして、このサフィックス機能せず、呼び出し元プロセス、EXECVとして()関数をコピーするための新しいプログラムのための既存の環境の環境変数を使用しました。

サフィックスL:新しいプログラムを形成するために、渡された指示パラメータリスト、新しいプログラムExecのから与えられた変数パラメータの形で渡されたすべてのパラメータ、最後のパラメータは、EXECL()関数としてNULLの終わりを示すために必要とされます。

サフィックスV:文字列配列に渡されるすべてのパラメータ()関数をEXECVようNULLの終了を示すために、配列の最後に、ベクトル形式を使用して、新しいプログラム、新しいプログラムに渡されたパラメータを示します。

 

機能のexecのファミリは、ただ何かがうまくいかない時に成功した場合、関数はそうでない場合は、返さない-1を返します。

4待機()関数

待つ()関数は、その子プロセスの終了ステータスを得るために、親プロセスを支援するために使用されます。プロセスが終了すると、カーネルは、子プロセスの健全性を判断するために、この情報に基づいて終了するには、各プロセスの親プロセスを終了ステータス情報の一定量を保存します。親は()関数呼び出しを待っていない場合、子プロセスは情報がメモリに保存されたまま終了します。

Lゾンビプロセスを:子供が死ぬ前に、その親プロセスの呼び出しのために()関数を待って、その後、子プロセスはゾンビプロセスになっていない場合。親呼び出しはそれを待つするゾンビプロセスは、()は、常にシステムの前に機能を占めます
メモリリソース。

リットルの孤児プロセス:子プロセスが孤立なり終了していない前に、親プロセスが終了した場合。initプロセスは、その終了ステータスを収集するための責任があることで孤児プロセスは直接、initプロセスチューブを受け取ることになります。

待つ()関数のプロトタイプ

含まは<sys / types.h>に

書式#include <sysの/ wait.h>

pid_t待機(int型*ステータス)。

Statusパラメータは、PID機能を取得、その後、子プロセスの終了ステータスポインタを保存するために使用され、それ以外の場合はを返し、成功の終了状態のプロセスが復帰-1。

 

 

 

5デーモン

    デーモン(デーモン)は、バックグラウンドでの特別なプロセスを実行しています。それはユーザーの入力が実行され、サービスを提供することができるようになります必要としない、制御端子とは独立しており、定期的にいくつかのタスクまたは保留中の特定のイベントが発生した実行します。それはinitプロセスによって継承された孤児であるので、それは本当に、子プロセスの終了前に、子プロセスの終了でフォーク後に親プロセスであるため、親は、initデーモンプロセスです。

デーモン()関数のプロトタイプ

書式#include <unistd.h>

int型のデーモン(int型nochdir、int型NOCLOSE)。

パラメータはnochdir:作業ディレクトリを使用すると、0を渡すと、関数は、ルートディレクトリに設定デーモンプロセスと呼ばれます、

そうでなければ、そのまま元の作業ディレクトリを保ちます。

パラメータはNOCLOSE:0を渡すと、デーモンの機能は、標準入力、標準出力、標準エラー出力を/ dev / nullファイルをリダイレクトする、またはこれらのファイル記述子を変更しないでください。

成功した場合、この関数は、0を返します。それ以外の場合は-1を返し、errnoを設定します。

 

おすすめ

転載: www.cnblogs.com/xiaoli94/p/11235704.html
おすすめ