exec族のシステムコール – プログラミング – Home

通知
すべてクリア

[解決済] exec族のシステムコール


tom
 tom
(@tom)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

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
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 80
 

ここは、VC++ラウンジだから板違いでは・・


返信引用
tom
 tom
(@tom)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

あ、そうなんですか。トップにはVC++,C/C++と書いてあったので全部いいのかと思いました。


返信引用
くたくた
 くたくた
(@くたくた)
ゲスト
結合: 23年前
投稿: 119
 

>strtokの使い方が間違っているのでしょうか。
正しいと思います。(argには、arg[0]にls,arg[1]に-lがちゃんと入っていてより)

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

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

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


返信引用
tom
 tom
(@tom)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

くたくたさん、お返事ありがとうございます。

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

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


返信引用
くたくた
 くたくた
(@くたくた)
ゲスト
結合: 23年前
投稿: 119
 

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

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

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


返信引用
tom
 tom
(@tom)
ゲスト
結合: 23年前
投稿: 16
Topic starter  

どうもありがとうございます。
fgetsを使った場合とgetsを使った場合で上手くいくときといかないときが
わかれました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました