C言語

【C言語】execve関数の使い方、正しく理解していますか?

関数仕様

書式

 引数

filepath プログラム(実行バイナリ or スクリプト)ファイルのパス
argv プログラムに渡す引数の配列(NULLポインタで終端)
envp プログラムに渡す環境変数の配列(NULLポインタで終端)

戻り値

なし 成功の場合はリターンしない
-1 execve に失敗

 

機能

  • 引数 filepath で指定したプログラムを実行する
  • プログラムの起動引数は argv、環境変数は envp で指定可能
  • execve を呼び出した元のプログラムは、指定したプログラムに置き換わって実行される

 

注意すること

注意ポイント①

環境変数 PATH は参照されない

execve では、環境変数の PATH は参照されません
そのため、引数の filepath には、実行したいプログラムの絶対パス、
またはカレントディレクトリからの相対パスを指定します。

また、filepath の指定とは別に、プログラムに渡す第0引数である argv[0] も別途指定します。

 

注意ポイント②

execve で実行したプログラムのプロセスIDは、呼び出し前と同じIDのまま変わらない

execve で実行したプログラムのプロセスIDは、
execve呼び出したプログラムと同じプロセスIDのまま変わりません

通常、execve を呼び出すプログラムは、まず fork で子プロセスを作成した後、
その子プロセスから execve を呼び出して目的のプログラムを実行します。

あらかじめ fork を実行することにより、目的のプログラムを実行した後も
元のプログラム自身の実行を継続することができます。

関連

子プロセスを生成する fork については、「fork関数の使い方と注意点」にまとめています。

 

execve 関連の標準Cライブラリ関数

冒頭の書式で少し紹介しましたが、標準Cライブラリ関数には、
execve システムコールを呼び出すラッパー関数があります。

execl() のように語尾に「l」が付く関数は、プログラムの引数を関数の引数に直接指定します。
execlp() のように語尾に「p」が付く関数は、環境変数 PATH を参照してプログラムを検索します。
execl() のように語尾に「e」が付かない関数は、呼び出し元の環境変数をそのまま継承します。

関数名 種別 起動引数 PATHの参照 環境変数
execl() 標準Cライブラリ関数 直接記述 しない 継承
execlp() 標準Cライブラリ関数 直接記述 する 継承
execle() 標準Cライブラリ関数 直接記述 しない 引数指定
execv() 標準Cライブラリ関数 配列渡し しない 継承
execvp() 標準Cライブラリ関数 配列渡し する 継承
execve() システムコール 配列渡し しない 引数指定

 

サンプルプログラム

システムコール「execve」

標準Cライブラリ関数

 

こちらの記事もよく読まれています

  • この記事を書いた人
  • 最新記事
SANACHAN

SANACHAN

「生涯一エンジニア」を掲げ、大手グローバル企業でSE/PGとして8年勤め、キャリアアップ転職した現役のエンジニアです。世にあるメジャーな全プログラム言語(コボル除く)を自由に扱えます。一児の父。自分のため、家族のため、日々勉強してます。システムエンジニア、プログラミングに関する情報を蓄積している雑記帳です。

-C言語
-, , ,