execv の argv[0] 相当の引数の処理のされ方 ― 2019年02月25日 15時38分37秒
% 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」として実行する。
別の末端で行った ps の出力は ca~t となっているが、実行されているのは cat になっている。
% 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)
この様にプログラム名は execv の実行に影響を及ばさないことが多い。うっかり argv[0] にプログラム名を渡すのを忘れると、最初の引数の効果が有効にならないといったバグになる。プログラムは問題なく実行しているのに、なぜだか一部の機能だけが有効にならないといった、見付けづらいバグになるだろう。
ps で見ると、cat は実行されている。-n と言うプログラムは実際に存在しないが、そう表示される。また、見て分かる通り cat の出力に行番号がつかない。
% 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)
前回。
最近のコメント