もっと詳しく

execvp()関数はexecファミリーに属しています。 今日のトピックでは、execファミリでのexecvp()関数の特性とアプリケーションについて説明します。

c言語のexecファミリの機能は、プログラム内で他のプログラムを実行するのに役立ちます。 私のプログラム内からそれを行うために、関数のexecファミリーと呼ばれる関数のセットを使用します。これらはLinuxプログラムにあります。

execvp()関数の適用

プログラムのpingを実行する場合は、execvp()関数を使用してこれを適用できます。 このためには、配列を使用する必要があります。 execvp()関数に使用される文字「v」はベクトルを表します。

構文

execvp()関数の構文:

int execvp ((const char *ファイル char *const)。

ここで、最初のパラメーターは、プログラムで実行されるファイルを指すファイルポインターです。

2番目のパラメーターは、タイプが文字であり、ヌルターミネーターとして使用されるポインター定数です。

プログラミング例1

ここでは、execvp()関数が実際にプログラムでどのように機能するかを確認します。

#include
#include
#include
#include //Linuxプラットフォーム用にこのファイルを含める

int 主要((int argcchar *argv[])。
{{
char *ar[10] = {{「ping」“Google COM”「-c10」ヌル} ; //配列の宣言と初期化
execvp((「ping」ar)。 ;
printf (( “execvp()関数が最初に実行されるため、応答がありません n 「」
// execvpが成功を返した場合、execvp()がプログラムを制御するため、このステートメントは実行されません。
戻る 0 ;
}

出力

説明
このプログラミング例では、Linuxプラットフォームでexecvp()関数を使用して「google.com」にpingを実行する場合、プログラムにunistd.hという名前のヘッダーファイルをインクルードする必要があります。

execvp()関数を実行するには、arという名前の配列(実際には文字列の配列)を宣言する必要があります [] 「ping」、「google.com」、NULLなどの値を初期化しました。

ここで、execvp()関数の括弧内に引数の配列を渡そうとすると、出力としてgoogle.comにpingを実行していることがわかります。

プログラミング例2

ここでは、execvp()関数の別のアプリケーションを示します。

#include //Linuxプラットフォーム用にこのファイルを含める
#include
#include
#include

int 主要(()。
{{
char *cmd = “CD” ;
char *arr_ls[] = {{ “CD”「/root/nothing」ヌル} ; //配列の宣言と初期化
errno = 0;

int id = execvp((cmdarr_ls)。 ;
もしも(( id == 1 )。
{{
printf((「」 nexecvpによって返されるエラー番号は次のとおりです:%d n「」 errno)。;

もしも ((errno == 2)。
printf((“!!そのようなファイル、又はディレクトリはありません!! n「」)。;
そうしないと
恐怖((「execvp」)。;
}
printf (( 「execvpが成功を返した場合、この行は表示されません。それ以外の場合は、この行が表示されます。 n 「」 )。 ;
戻る 0;
}

出力

説明
このプログラミング例では、execvp()関数がfalse値を返すかどうかを確認します。 execvp()関数がfalse値を返す場合、「エラーなし」 これは2であり、次のメッセージを出力します。 “そのようなファイル、又はディレクトリはありません”。

execvp()関数がtrue値を返す場合、execvpの後のステートメントは実行されません。 execvp()関数の特性からわかるように、execvp()関数がプログラムを制御する場合、1行は実行されません。

プログラミング例3

このプログラミング例では、fork()またはプロセスに関連するexecvp()関数の重要なアプリケーションを確認します。

#include
#include
int 主要(()。
{{

char *cmd = 「ls」 ;

char *arg_ls[] = {{「ls」「-l」ヌル};

printf (( “execvp()が呼び出される前のステートメントの実行例 n「」 )。 ;

printf (( 「フォークを示すもう1つのプロセスを導入しています n「」 )。 ;

もしも(( フォーク(()。 == 0 )。 //「ls-l」によって制御される子プロセスが導入されます

{{

int sts_cd = execvp((cmdarg_ls)。 ;

printf(( 「このステートメントは実行されます。これは、コマンドの実行に問題があることを意味します n「」 )。 ;

もしも(( sts_cd == 1 )。

{{

printf(( 「execvpエラー! n「」 )。 ;

戻る 1 ;

}

}

そうしないと //ここで実行される親プログラム

{{

printf (( 「このステートメントは実行されます。つまり、メインプログラムに戻ります。 n「」 )。 ;

}

戻る 0 ;
}

出力

説明
cのexecファミリのすべての関数と同様に、execvp()関数はプログラム内の他のプログラムを実行できます。

このプログラミング例では、文字配列または文字列名を宣言します arg_ls[]。 この文字列内で、いくつかの値とNULLも初期化します。 次に、fork()と呼ばれる別のプロセスを呼び出します。

ここで、execvp()関数はtrue値を返します。 したがって、fork()関数はそのアクションを正常に実行できます。 そうでない場合は、メインプログラムに移動します。

プログラミング例4

ここでは、execvp()関数の別の機能を確認します。

#include
#include
int 主要(()。
{{

char *cmd = “CD” ;

char *arg_ls[] = {{“CD”「/root/bam」ヌル};

printf (( “execvp()が呼び出される前のステートメントの実行例 n「」 )。 ;

printf (( 「フォークを示すもう1つのプロセスを導入しています n「」 )。 ;

もしも(( フォーク(()。 == 0 )。 //「ls-l」によって制御される子プロセスが導入されます

{{

int sts_cd = execvp((cmdarg_ls)。 ;

printf(( 「このステートメントは実行されます。これは、コマンドの実行に問題があることを意味します n「」 )。 ;

もしも(( sts_cd == 1 )。

{{

printf(( 「execvpエラー! n「」 )。 ;

戻る 1 ;

}

}

そうしないと //ここで実行される親プログラム

{{

printf (( 「このステートメントは実行されます。つまり、メインプログラムに戻ります。 n「」 )。 ;

}

戻る 0 ;
}

出力

説明
上記のプログラミング例は、プログラミング例3の修正バージョンです。ここでは、関数fork()が「0」を返すかどうかを確認します。 次に、子プロセスはコードを実行し、によって制御されます 「ls-」l 指図。 execvp()を返す値は、という名前の変数に割り当てられます sts_cd。 sts_cdの場合 値-1が表示され、それがexecvp()関数のエラーであることがわかります。 それ以外の場合、この関数はプログラムの残りの部分を制御します。

結論

execファミリでのexecvp()の実装に関する上記の説明から、新しいプロセスを実行するために、プロセスイメージをRAM(ランダムアクセスメモリ)内の新しいイメージに置き換えるという結論に達しました。 実際、この機能は、オペレーティングシステムが、プロセッサによって実行できるすべてのプロセスをより短い時間で管理するのに役立ちます。

The post CでのExecvp関数 appeared first on Gamingsym Japan.