Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxのプログラミング環境は、フォークとのexeclpと-waitpid

Linuxのプログラミング環境は、フォークとのexeclpと-waitpid

  
 

のwaitpid(中断または終了子待つ)ヘッダファイル#が含ま< SYS /types.hで>#が含ま< SYS /wait.h>定義関数pid_tのwaitpidの(pid_tのPID、INT *ステータス、INTオプション);機能説明のwaitpid()は、一時的に現在のプロセスの実行を停止し、または信号は、子プロセスの最後に来たまで。子プロセスが終了した場合は()待機を呼び出すときに、待ち()直後に子プロセスの終了ステータス値を返します。子プロセスが識別コードと共に返されるつつ、終了状態値は、子プロセスパラメータの状態によって返されます。終了状態が値を気にしない場合は、ステータスパラメータがNULLに設定することができます。識別コードを待っされる子プロセスパラメータのPID、他の値は次の意味:PID< -1任意のサブプロセスpidの絶対値として、プロセスグループ識別コードを待っ。 PID = -1)(待つためにすべての子プロセスと同等のを待ちます。 PID = 0のプロセスは、同じプロセスの任意の子プロセスと現在のグループ識別子を待ちます。 PID> 0は子プロセスの子プロセス識別子PIDを待ちます。パラメータオプションは、0または以下の組み合わせORすることができます:子プロセスが終了していない場合WNOHANGすぐに待っていない、返されます。 WUNTRACED返す権利が、最終状態の実装をサスペンドするには、子プロセスを無視すべきではない場合。子プロセスが非ゼロ値と比較し、正常終了した場合WIFEXITED(ステータス):ステータスに格納された子プロセスのリターンの状態が終了した後、いくつかのマクロ下ケースの端部を決定することができます。子プロセスの終了を得るWEXITSTATUS(ステータス)は、()正常終了このマクロを使用するかどうかを決定するためにWIFEXITEDで通常最初、終了コードを返します。 WIFSIGNALED(ステータス)は、子プロセスが終了された場合に信号が真であるので、このマクロWTERMSIG(ステータス)は、子供が原因信号に中止信号コードを取得し、通常このマクロ使用後WIFSIGNALEDによって決定されるであろう。 WIFSTOPPED(ステータス)子供がマクロの実行を中断されている場合はtrueです。 WUNTRACEDこのような状況を持っている場合、一般的にのみ使用。子プロセスは、信号のポーズを得るために起因WSTOPSIG(ステータス)コードは、一般的には、このマクロを使用WIFSTOPPED最初の使用の後に決定されるであろう。成功した子プロセスID(PID)が返される場合がある場合は、-1のエラーの戻り値が返されます。失敗の理由はerrnoに格納されます。 /****** * waitpid.c - シンプル待機使用********* /の#include< unistd.h>の#include< SYS /types.hで>の#include< SYS /待ちます.H>の#include< stdio.hの>の#include< STDLIB.H> INTメイン(ボイド){pid_t childpid、INT状態; childpid =フォーク(); IF(-1 == childpid){perrorは("。フォーク()");}そうでない場合(0 == childpid){プット("出口(EXIT_FAILURE)子プロセス"で;);睡眠(3); //子プロセスが親を見るために3秒をステージします行動のprintf(" \\ tchild PID =%D \\ N"、GETPID());のprintf(" \\ tchild PPID =%D \\ N"、getppid());出口(EXIT_SUCCESS);}他{waitpidの( childpid、&#038;ステータス、0);プット(");のprintf("親"で\\ tparent PID =%D \\ N"(GETPID));のprintf(" \\ tparent PPID =%D \\ N"。 、getppid());のprintf(" \\のtchildプロセスは、%D \\ N"状態で終了し、ステータス);}出口(EXIT_SUCCESS);} [ルート@のローカルホストSRC]#1のGCC waitpid.c [ルート@のローカルホストSRC]親親PIDに= 4468子プロセス子PID = 4469子PPIDに#./a.out = 4468親= 4379子プロセスがステータス0 [ルート@ localhostののソース]で終了しましたPPID#場合は上記の' waitpidの(childpid、&#038;状態、0);&'は、次のようにプログラムの実行結果は、行をコメントアウトします。[root @ localhostののソース]#子プロセスで./a.out親の親のpid = 4481親PPID = 4379子プロセスがステータスで終了しましたに1331234400 [ルート@ localhostののソース]#子のpid = 4482子PPID = 1子プロセスが終了していないが、親プロセスから撤退しました。

フォーク

フォーク()関数、Linuxのシステムコールヘッダーファイル:の#include< unistd.h>関数定義:int型フォーク(ボイド);戻り値:子プロセスは0を返します。親は子プロセスIDを返し、関数は-1を返し、エラーの説明:既存のプロセスは、新しいプロセスを作成するfork関数を呼び出すことができます。フォークで作成された新しいプロセスは子プロセス(子プロセス)と呼ばれています。フォーク関数が一度呼び出さが、二回返しています。両者の唯一の違いは、子プロセスのリターンである0の値は、子と親プロセスIDで返される返します。子プロセスは親プロセスのコピーである、それはそうで親プロセスデータ空間、ヒープ、リソースのスタックコピーとを取得します。子供が&'の収納スペースが保持していることに注意してください。コピー&'間の収納スペースを共有しません。、彼らのストレージスペースの間だけのコードセグメントを共有し、親と子のことを意味しています。サンプルコード:の#include< unistd.h>の#include< stdio.hの> int型のmain(int型ARGC、ボイド** ARGV){int型PID =フォーク(); IF(PID< 0){//プリント( "!エラー"}それ以外(PID == 0){//印刷("場合;;)これは、子プロセス"!である);}他{//印刷("これは、親プロセスの子です!プロセスID =%D" PID);}戻り0;}


のexeclp

のexeclp(PATH環境変数にファイルを検索し、実行する)相関関数:フォーク、EXECL、execle、EXECV、はexecve、execvpのヘッダーファイル:#含める< unistd.h>定義された関数:int型のexeclp(CONSTのchar *ファイル、CONSTのchar *の引数、……);機能説明:のexeclp()ますパラメータファイルの行で言及ディレクトリPATH環境変数ファイル名を見つけ、実行後のファイルを検索し、ファイルのargv [0]、ARGV [1]&hellipとして目以降のパラメータ;…最後の引数は、ヌル(NULL)とのポインタでなければなりません終わりのため。戻り値:機能が正常に実行、ダイレクトリターン-1失敗した場合は、errnoに保存された障害の原因を返さない場合。エラーコードリファレンスはexecve()。例:/* /binに/LSを* /#を見つけるために)(-Al /etc /passwdファイルのexeclp LSを実行含める< PATH変数/ビンに従って、unistd.h>メイン(){のexeclp(' LS',&'。 LS',' -Al',' /etc /passwdファイル',(CHAR *)0);}行わ:-rw-R - r--の1ルートのルートを705 9月3日13:52 /etc /passwdファイル———————————————————————————————— love_aiqiu名称EXECL、のexeclp、execle、EXECV、execvpのにより追加 - ファイル式#include<を実行する。unistd.h>にexternチャー**環境; INT EXECL(CONST CHAR *パス、のconstのchar *の引数、...); int型のexeclp(定数のchar *ファイル、CONSTするchar *引数、...); int型のexecle(定数のchar *のパス、CONSTのchar *引数、...、CHAR * CONST envpを[]); int型EXECV(CONSTのchar *パス、チャー*のCONST)[] ARGV; int型execvpの(CONSTのchar *ファイル)[] ARGVするchar * constの、

Copyright © Windowsの知識 All Rights Reserved