この記事では、execファミリーの関数について説明し、Cでこれらのexecファミリー関数のそれぞれを使用する方法を示します。それでは、始めましょう。
ExecファミリのCシステム関数:
exec関数ファミリはヘッダーで定義されています unistd.h 。したがって、これらの関数を使用するCプログラムでこのヘッダーを使用する必要があります。
使用可能なexec関数とその関数パラメーターを以下に示します。
- int execl(const char * path、const char * arg、…、NULL);
- int execlp(const char * file、const char * arg、…、NULL);
- int execv(const char * path、char * const argv []);
- int execvp(const char * file、char * const argv []);
- int execle(const char * path、const char * arg、…、NULL、char * const envp []);
- int execve(const char * file、char * const argv []、char * const envp []);
これらの各関数の機能と使用方法を見てみましょう。
execl()システム関数:
execl()では、システム関数は実行可能バイナリファイルのパスを取ります(つまり、 / bin / ls )最初と2番目の引数として。次に、引数(つまり -lh 、 /家 )実行可能ファイルに渡したいものに続いて ヌル 。次に、execl()システム関数がコマンドを実行し、出力を出力します。エラーが発生した場合、execl()は-1を返します。それ以外の場合は、何も返しません。
構文:
intexecl((const char *道、 const char *怒り、..。、ヌル)。;execl()システム関数の例を以下に示します。
#含む
int主要((空所)。 {{
char *binaryPath= '/ bin / ls';
char *arg1= '-lh';
char *arg2= '/家';
execl((binaryPath、binaryPath、arg1、arg2、ヌル)。;
戻る 0;
}
私は走った ls -lh /ホーム execl()システム関数を使用したコマンド。ご覧のとおり、正しい結果が表示されます。
execlp()システム関数:
execl()はを使用しません 道 環境変数。したがって、execl()で実行するには、実行可能ファイルのフルパスが必要です。 execlp()はPATH環境変数を使用します。したがって、実行可能ファイルまたはコマンドがPATHで使用可能な場合、コマンドまたはファイル名で実行できれば、フルパスは必要ありません。
構文:
intexeclp((const char *ファイル、 const char *怒り、..。、ヌル)。;execlp()システム関数を使用してexecl()の例を次のように書き直すことができます。
#含むint主要((空所)。 {{
char *programName= 'ls';
char *arg1= '-lh';
char *arg2= '/家';
execlp((programName、programName、arg1、arg2、ヌル)。;
戻る 0;
}
コマンド名だけを渡しました ls 、フルパスではありません / bin / ls 。ご覧のとおり、以前と同じ出力が得られました。
execv()システム関数:
execl()関数では、実行可能ファイルのパラメーターが異なる引数として関数に渡されます。 execv()を使用すると、NULLで終了する配列ですべてのパラメーターを渡すことができます。 argv 。配列の最初の要素は、実行可能ファイルのパスである必要があります。それ以外の場合、execv()関数はexecl()関数と同じように機能します。
構文:
intexecv((const char *道、 char *constargv[])。;execl()の例を次のように書き直すことができます。
#含むint主要((空所)。 {{
char *binaryPath= '/ bin / ls';
char *args[] = {{binaryPath、 '-lh'、 '/家'、ヌル};
execv((binaryPath、args)。;
戻る 0;
}
ご覧のとおり、正しい出力が得られています。
execvp()システム関数:
execv()システム関数と同じように機能します。ただし、PATH環境変数が使用されます。したがって、execlp()の場合のように、実行可能ファイルのフルパスは必要ありません。
構文:
intexecvp((const char *ファイル、 char *constargv[])。;execv()の例を次のように書き直すことができます。
#含むint主要((空所)。 {{
char *programName= 'ls';
char *args[] = {{programName、 '-lh'、 '/家'、ヌル};
execvp((programName、args)。;
戻る 0;
}
ご覧のとおり、正しい出力が表示されます。
execle()システム関数:
execl()と同じように機能しますが、独自の環境変数を一緒に提供できます。環境変数は配列として渡されます envp 。の最後の要素 envp 配列はNULLである必要があります。他のすべての要素には、キーと値のペアが文字列として含まれています。
構文:
intexecle((const char *道、 const char *怒り、..。、ヌル、 char * constenvp[] )。;execle()システム関数の例を以下に示します。
#含むint主要((空所)。 {{
char *binaryPath= '/ bin / bash';
char *arg1= '-NS';
char *arg2= '捨てた '$ HOSTNAMEにアクセス:ブラウザからの$ PORT。'';
char *constenv[] = {{'HOSTNAME = www.linuxhint.com'、 'PORT = 8080'、ヌル};
execle((binaryPath、binaryPath、arg1、arg2、ヌル、env)。;
戻る 0;
}
2つの環境変数を渡しました ホスト名 と 港 execle()関数に。ご覧のとおり、実行可能ファイルからアクセスできます / bin / bash 。
execve()システム関数:
execle()と同様に、execve()とともに独自の環境変数を提供できます。 execv()で行ったように、引数を配列として渡すこともできます。
構文:
int実行する((const char *ファイル、 char *constargv[]、 char *constenvp[])。;execle()の例は、次のように書き直すことができます。
#含むint主要((空所)。 {{
char *binaryPath= '/ bin / bash';
char *constargs[] = {{binaryPath、 '-NS'、 '捨てた '$ HOSTNAMEにアクセス:$ PORT
ブラウザから。''、ヌル};
char *constenv[] = {{'HOSTNAME = www.linuxhint.com'、 'PORT = 8080'、ヌル};
実行する((binaryPath、args、env)。;
戻る 0;
}
ご覧のとおり、execle()の例と同じ出力が得られます。
つまり、LinuxでのシステムプログラミングにCでexec関数ファミリを使用する方法です。この記事を読んでくれてありがとう。