exec族のシステムコール

[戻る]
tom 2002/06/01(土) 01:37:24
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などのコマンドを実行させるらしいんですが、
いろいろ調べても見つかりませんでした。わかる方がいましたら教えてもらえませんか。

不良PG [E-Mail] 2002/06/01(土) 03:27:36
ここは、VC++ラウンジだから板違いでは・・

tom 2002/06/01(土) 12:26:33
あ、そうなんですか。トップにはVC++,C/C++と書いてあったので全部いいのかと思いました。

くたくた 2002/06/01(土) 14:08:44
>strtokの使い方が間違っているのでしょうか。
正しいと思います。("argには、arg[0]にls,arg[1]に-lがちゃんと入っていて"より)

execvp()の最初の引数は コマンドプロセッサ文字列 を指定するのではないでしょうか。
試しに シェル名 を指定してみて下さい。

>プログラム中から本物のシェルにls *.cなどのコマンドを実行させるらしいんですが、
execvp()の代替手段に、system()があります。

>ここは、VC++ラウンジだから板違いでは・・
>トップにはVC++,C/C++と書いてあったので全部いいのかと思いました。
両方正しいと思います。但しVC++専用感が強いですね。(トップ以外は全てVC++と書いてある)

tom 2002/06/01(土) 22:08:48
くたくたさん、お返事ありがとうございます。

>execvp()の最初の引数は コマンドプロセッサ文字列 を指定するのではないでしょうか。
>試しに シェル名 を指定してみて下さい。

具体的にはどう書けば良いのでしょうか。
プログラムの中で
arg[0]="ls";
arg[1]=NULL;
execvp(arg[0],arg)
のように書く方法だと上手く動作するんですが、コマンドを自分で入力するように
すると上手く動作しませんでした。使い方はいいような気がするんですが…

くたくた 2002/06/03(月) 12:11:28
>arg[0]="ls"; arg[1]=NULL; execvp(arg[0],arg);
>のように書く方法だと上手く動作するんですが
この事から、"自分で入力してからexecvp()を実行する所までにミスがある"
事が予想できます。

予測の1つとして「buffのサイズが小さ過ぎるのかな?」と思いました。
2つ目は "fork()"からみかもしれないと思いました。
それに関係する説明及びコードの既述が皆無な為、推測が難しいです。

どちらにせよ、これまでの文脈から かなり狭い範囲にミスがあると思います。
ここまで絞れたら、あとは頑張って下さい。

tom 2002/06/05(水) 01:26:08
[[解決]]
どうもありがとうございます。
fgetsを使った場合とgetsを使った場合で上手くいくときといかないときが
わかれました。

古いスレッドには追加発言できません。