execv の argv[0] 相当の引数の処理のされ方2019年02月25日 15時38分37秒

FreeBSD の ps ではプログラムに渡された引数も表示される。
% cat -n
...
% ps
5300  4  T    0:00.01 cat -n
%

ls はどの OS でもたくさんの引数があって、色々な書式で様々な値を表示できるので、他でも同じことはできるだろう。なお、ps は別の xterm で行った。

execv 関数で、プログラムに渡される argv[0] に相当するプログラム名を調べるプログラムは少ない。argv[0] を調べるプログラムは、実行された時の名前によって動作を変えたいプログラムで有効だ。

execlp でどう見えるか実験する。argv[0] 相当のプログラム名を「ca~t」として実行する。

% cat execlp1.c
#include <unistd.h>

int main()
{
    execlp( "cat", "ca~t", "-n", NULL );
    return -1;
}
% cc execlp1.c
% ./a.out 
a
     1  a
b
     2  b
...
% ps
5311  1  I+   0:00.01 ca~t -n (cat)

別の末端で行った ps の出力は ca~t となっているが、実行されているのは cat になっている。

この様にプログラム名は execv の実行に影響を及ばさないことが多い。うっかり argv[0] にプログラム名を渡すのを忘れると、最初の引数の効果が有効にならないといったバグになる。プログラムは問題なく実行しているのに、なぜだか一部の機能だけが有効にならないといった、見付けづらいバグになるだろう。

% cat execlp2.c
#include <unistd.h>

int main()
{
    execlp( "cat", "-n", NULL );
    return -1;
}
% cc execlp2.c
% ./a.out 
a
a
b
b
...
% ps
5319  1  I+   0:00.01 -n (cat)
ps で見ると、cat は実行されている。-n と言うプログラムは実際に存在しないが、そう表示される。また、見て分かる通り cat の出力に行番号がつかない。

前回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2019/02/25/9040583/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。