UNIXでCのプログラミングをしています。
execvpを使ったシステムコールがよくわからないので教えてください。
プログラム中で
ls -l
などのコマンドを入力し、それをfork()を使って新しくプロセスを作って実行する
という問題です。まずls -lのようなコマンドを、スペースを区切りとして「ls」と「-l]
に分けようと思い、
char *str 入力用
char *arg[NUM] コマンドを入れる用
gets(buff) /*コマンド読みこみ*/
str = strtok(buff, ) /*空白で区切りstrに入れて、buffの最後までarg[i番目]に
--途中省略-- 入れていく。最後にNULLも追加。
arg[0] = str
・・・・・
execvp(arg[0],arg)
としました。argには、arg[0]にls,arg[1]に-lがちゃんと入っていて、arg[2]にNULL
を入れる操作も付けました。argの中身は正しく入っているような気がしますがls -l が
呼び出せません。「ls」などの単独でも呼び出せませんでした。
strtokの使い方が間違っているのでしょうか。
それと、このプログラム方法だとls *.c などのようなコマンドはできないようなので
す。プログラム中から本物のシェルにls *.cなどのコマンドを実行させるらしいんですが、
いろいろ調べても見つかりませんでした。わかる方がいましたら教えてもらえませんか。
ここは、VC++ラウンジだから板違いでは・・
あ、そうなんですか。トップにはVC++,C/C++と書いてあったので全部いいのかと思いました。
>strtokの使い方が間違っているのでしょうか。
正しいと思います。(argには、arg[0]にls,arg[1]に-lがちゃんと入っていてより)
execvp()の最初の引数は コマンドプロセッサ文字列 を指定するのではないでしょうか。
試しに シェル名 を指定してみて下さい。
>プログラム中から本物のシェルにls *.cなどのコマンドを実行させるらしいんですが、
execvp()の代替手段に、system()があります。
>ここは、VC++ラウンジだから板違いでは・・
>トップにはVC++,C/C++と書いてあったので全部いいのかと思いました。
両方正しいと思います。但しVC++専用感が強いですね。(トップ以外は全てVC++と書いてある)
くたくたさん、お返事ありがとうございます。
>execvp()の最初の引数は コマンドプロセッサ文字列 を指定するのではないでしょうか。
>試しに シェル名 を指定してみて下さい。
具体的にはどう書けば良いのでしょうか。
プログラムの中で
arg[0]=ls;
arg[1]=NULL;
execvp(arg[0],arg)
のように書く方法だと上手く動作するんですが、コマンドを自分で入力するように
すると上手く動作しませんでした。使い方はいいような気がするんですが…
>arg[0]=ls; arg[1]=NULL; execvp(arg[0],arg);
>のように書く方法だと上手く動作するんですが
この事から、自分で入力してからexecvp()を実行する所までにミスがある
事が予想できます。
予測の1つとして「buffのサイズが小さ過ぎるのかな?」と思いました。
2つ目は fork()からみかもしれないと思いました。
それに関係する説明及びコードの既述が皆無な為、推測が難しいです。
どちらにせよ、これまでの文脈から かなり狭い範囲にミスがあると思います。
ここまで絞れたら、あとは頑張って下さい。
どうもありがとうございます。
fgetsを使った場合とgetsを使った場合で上手くいくときといかないときが
わかれました。