いっしょにtalk C栗(第百三十五回:C言語例--execシリーズ関数一)
皆さん、こんにちは.前回は「スレッドを作成するときのメモリの詳細」の例でしたが、今回はexecシリーズ関数の例です.余談はさておき,話は本筋に戻る.一緒にtalk C栗を食べましょう!
ご覧のように、プロセスメモリの作成の詳細については、execシリーズ関数について説明しましたが、詳細は説明されていませんでした.今日はexecシリーズ関数を見てみましょう.
execシリーズ関数は、あるプロセスをexecシリーズ関数を呼び出すプロセスにインポートし、現在のプロセスを新しいプロセスに置き換えることができます.前の章でも紹介しましたが、execシリーズ関数を実行すると、書き込み時のコピーがトリガーされるため、新しいプロセスは独自のコード領域、データ領域、スタック領域、スタック領域を持っています.
まずexecシリーズ関数から1つの関数を選択して紹介します.これにより、直感的な印象を与えることができます.次に、execシリーズ関数の関数execlpを示します.関数のプロトタイプは次のとおりです.関数の最初のパラメータはファイル名であり、実行可能なファイル名またはスクリプトファイル名を表す. 関数の2番目のパラメータは、実行可能ファイルに渡されるパラメータであり、実行可能ファイルのmain関数のargv[]に渡される. 関数のパラメータ数は可変ですが、最後のパラメータは常に空のポインタです. 関数の実行成功時には戻り値がなく、実行エラー時には-1を返す.
次に,この関数の使用方法を実際のコードで説明する.以下は詳細なコードです.参考にしてください.
上のコードは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[]のパラメータを渡して実行可能ファイルを実行します.
以下はプログラムの実行結果です.参考にしてください.
端末でechoコマンドを単独で実行することもできます.次に、このコマンドを実行した結果を示します.
上記の結果から、さっきのプログラムの実行結果と一致していることがわかります.
皆さん、execシリーズ関数の例についてお話しします.後に何か例があるか知りたいので、次の分解を聞いてください.
ご覧のように、プロセスメモリの作成の詳細については、execシリーズ関数について説明しましたが、詳細は説明されていませんでした.今日はexecシリーズ関数を見てみましょう.
execシリーズ関数は、あるプロセスをexecシリーズ関数を呼び出すプロセスにインポートし、現在のプロセスを新しいプロセスに置き換えることができます.前の章でも紹介しましたが、execシリーズ関数を実行すると、書き込み時のコピーがトリガーされるため、新しいプロセスは独自のコード領域、データ領域、スタック領域、スタック領域を持っています.
まずexecシリーズ関数から1つの関数を選択して紹介します.これにより、直感的な印象を与えることができます.次に、execシリーズ関数の関数execlpを示します.関数のプロトタイプは次のとおりです.
int execlp(const char *file, const char *arg, ...)
次に,この関数の使用方法を実際のコードで説明する.以下は詳細なコードです.参考にしてください.
#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[]の内容を見てみましょう.
実行ファイルがあって、実行ファイルのパラメータもあって、本当に万事そろっていて、ただ東風に欠けています.急いではいけません.東風が来ました.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シリーズ関数の例についてお話しします.後に何か例があるか知りたいので、次の分解を聞いてください.