CでのExecシステムコール

Exec System Call C



execファミリには、Cで多くの関数があります。これらのC関数は、基本的に、メインプログラムとは別のプロセスでシステムコマンドを実行し、出力を出力するために使用されます。

この記事では、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((binaryPathbinaryPatharg1arg2ヌル)。;

戻る 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((programNameprogramNamearg1arg2ヌル)。;

戻る 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((binaryPathargs)。;

戻る 0;
}

ご覧のとおり、正しい出力が得られています。

execvp()システム関数:

execv()システム関数と同じように機能します。ただし、PATH環境変数が使用されます。したがって、execlp()の場合のように、実行可能ファイルのフルパスは必要ありません。

構文:

intexecvp((const char *ファイル char *constargv[])。;

execv()の例を次のように書き直すことができます。

#含む

int主要((空所)。 {{
char *programName= 'ls';
char *args[] = {{programName '-lh' '/家'ヌル};

execvp((programNameargs)。;

戻る 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((binaryPathbinaryPatharg1arg2ヌル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'ヌル};

実行する((binaryPathargsenv)。;

戻る 0;
}

ご覧のとおり、execle()の例と同じ出力が得られます。

つまり、LinuxでのシステムプログラミングにCでexec関数ファミリを使用する方法です。この記事を読んでくれてありがとう。