execvP 関数の利用例2019年02月18日 23時08分22秒

exec システム関数の中の execvp のパスを指定できるように FreeBSD が拡張したのが execvP。execvp と同じようにファイル名を指定してプログラムを探すが、探す場所を指定できる。

今回の実験では execvp が失敗し、execvP が成功したのを確認するために、perror でエラーを表示。また、FreeBSD では GNU make は gmake として /usr/local/bin に入れられる。PATH の初期値としては、/bin、/usr/bin、/usr/local/bin が入っている。その為、そのまま実行したら、一つ目の execvp が成功してプログラムは終る。もし、gmake の実行に失敗したら、execvP で明示的に /usr/local/bin を探しに行くようにしている。

% cat execvP.c
#include <unistd.h>
#include <stdio.h> /* perror */

int main()
{
    char* argv[] = { "gmake", "-n", NULL };
    execvp( "gmake", argv );
    perror( "execvp( gmake )" );
    execvP( "gmake", "/usr/local/bin/", argv );
    perror( "execvP( gmake )" );
    return -1;
}
% cc execvP.c
% ./a.out 
gmake: 'a.out' is up to date.
% env PATH=/bin:/usr/bin ./a.out
execvp( gmake ): No such file or directory
gmake: 'a.out' is up to date.
%
一回目の実行では、execvp が /usr/local/bin/gmake を見付けている。そこで、PATH 変数をこのコマンドだけ変えて、/usr/local/bin を抜いて実行したのが二回目の a.out。execvp は gmake を見付けることが出来なかったが、execvP は /usr/local/bin/gmake を見付けた。

前回次回