いっしょにtalk C栗(第百三十五回:C言語例--execシリーズ関数一)

4116 ワード

皆さん、こんにちは.前回は「スレッドを作成するときのメモリの詳細」の例でしたが、今回はexecシリーズ関数の例です.余談はさておき,話は本筋に戻る.一緒にtalk C栗を食べましょう!
ご覧のように、プロセスメモリの作成の詳細については、execシリーズ関数について説明しましたが、詳細は説明されていませんでした.今日はexecシリーズ関数を見てみましょう.
execシリーズ関数は、あるプロセスをexecシリーズ関数を呼び出すプロセスにインポートし、現在のプロセスを新しいプロセスに置き換えることができます.前の章でも紹介しましたが、execシリーズ関数を実行すると、書き込み時のコピーがトリガーされるため、新しいプロセスは独自のコード領域、データ領域、スタック領域、スタック領域を持っています.
まずexecシリーズ関数から1つの関数を選択して紹介します.これにより、直感的な印象を与えることができます.次に、execシリーズ関数の関数execlpを示します.関数のプロトタイプは次のとおりです.
 int execlp(const char *file, const char *arg, ...)
  • 関数の最初のパラメータはファイル名であり、実行可能なファイル名またはスクリプトファイル名を表す.
  • 関数の2番目のパラメータは、実行可能ファイルに渡されるパラメータであり、実行可能ファイルのmain関数のargv[]に渡される.
  • 関数のパラメータ数は可変ですが、最後のパラメータは常に空のポインタです.
  • 関数の実行成功時には戻り値がなく、実行エラー時には-1を返す.

  • 次に,この関数の使用方法を実際のコードで説明する.以下は詳細なコードです.参考にしてください.
    #include<unistd.h>
    #include<stdio.h>
    
    int main()
    {
        pid_t pid;
        pid_t pid_res;
        int stat_value;
    
        pid = fork();
    
        if(pid > 0)
        {
            printf("PID: %d -> Father Process is running 
    "
    ,getpid()); pid_res = wait(&stat_value); if(pid_res > 0) { printf("Son process finished: PID = %d
    "
    ,pid_res); } } else if(pid == 0) { printf("PID: %d -> Son Process is running
    "
    ,getpid()); execlp("echo","echo","hello",NULL); // execlp } else { printf("Create process failed
    "
    ); return 1; } return 0; }

    上のコードはforkによってサブプロセスを作成し、サブプロセスでexeclp関数を実行します.execlp関数の使い方を重点的に見てみましょう.
    関数に渡される最初のパラメータは実行可能ファイル名echoで、2番目と3番目のパラメータは「echo」と「hello」です.両方のパラメータは、実行可能ファイル(ここではecho)main関数のargv[]に渡されます.最後のパラメータは空のポインタであり、argv[]にも渡されます.そこでargv[]の内容を見てみましょう.
  • argv[0]の内容は「echo」である.
  • argv[1]の内容は「hello」である.
  • argv[2]の内容は「NULL」であり、コマンド終了フラグである.

  • 実行ファイルがあって、実行ファイルのパラメータもあって、本当に万事そろっていて、ただ東風に欠けています.急いではいけません.東風が来ました.execlp関数は東風です.システムの環境変数で実行可能ファイル「echo」を検索し、argv[]のパラメータを渡して実行可能ファイルを実行します.
    以下はプログラムの実行結果です.参考にしてください.
    PID: 4194 -> Father Process is running 
    PID: 4195 -> Son Process is running 
    hello                                 //execlp   echo          ,        
    Son process finished: PID = 4195 

    端末でechoコマンドを単独で実行することもできます.次に、このコマンドを実行した結果を示します.
    $ echo 'hello'  //        echo  
    hello           //         

    上記の結果から、さっきのプログラムの実行結果と一致していることがわかります.
    皆さん、execシリーズ関数の例についてお話しします.後に何か例があるか知りたいので、次の分解を聞いてください.