• ベストアンサー

execlp関数で「grep -lr hoe /home/root」が実行させるには?

RedHat9で以下のようにexeclp関数使って 「grep -lr hoe /home/root」 を実行させる実験をしています。でも $ cat ./test1.c #include<stdio.h> int main(void){ execlp("hoge1","-lr","hoe","/home/root"); return 0; } $ cat ./hoge1.c #include<stdio.h> int main(int argc,char *argv[]){ system("grep,argv[0],argv[1],argv[2]"); return 0; } $ gcc -o test1 test1.c $ gcc -o hoge1 hoge1.c $ ./test1 sh: line 1: grep,argv[0],argv[1],argv[2]: command not found となってしまいます。 どのようにコーディングすればいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.5

hoge1の呼び出しの時点で失敗しているような気がします。 int main(void){ execlp("hoge1","hoge1","-lr","hoe","/home/user01",NULL); printf("error\n"); return 0; } でerrorが表示されるようなら、execlpは成功時に処理を返してこないので、hoge1の呼び出しを失敗していることになります。 hoge1があるところにPATHが通っているか確認してみてください。 あるいはhoge1とtest1を同じディレクトリに置き、 execlp("./hoge1","./hoge1","-lr","hoe","/home/user01",NULL); とするのも問題の切り分けにいいかも知れません。

_Yuuka
質問者

補足

> hoge1の呼び出しの時点で失敗しているような気がします。 > int main(void){ > execlp("hoge1","hoge1","-lr","hoe","/home/user01",NULL); > printf("error\n"); > return 0; > } > でerrorが表示されるようなら、execlpは成功時に処理を返してこないので、hoge1の > 呼び出しを失敗していることになります。 $ cat ./test1.c #include<stdio.h> #include <unistd.h> int main(void){ execlp("hoge1","hoge1","-lr","hoe","/home/user01",NULL); printf("error\n"); return 0; } $ ./test1 error となりました。 という事はhoge1の呼び出しに失敗しているのですね。 > hoge1があるところにPATHが通っているか確認してみてください。 パスは通っていませんでした。 > あるいはhoge1とtest1を同じディレクトリに置き、 > execlp("./hoge1","./hoge1","-lr","hoe","/home/user01",NULL); > とするのも問題の切り分けにいいかも知れません。 $ cat ./test1.c #include<stdio.h> #include <unistd.h> int main(void){ execlp("./hoge1","./hoge1","-lr","hoe","/home/user01",NULL); printf("error\n"); return 0; } $ ./test1 で漸く上手くいきました。 "./hoge1" としなければならなかったのですね。 大変有難うございました。m(_ _)m

その他の回答 (4)

  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.4

argの一番最初、つまり二番目の引数には呼び出すコマンド名を入れておく必要があるそうです。 execlp("hoge1","hoge1","-lr","hoe","/home/root",NULL);

参考URL:
http://jbbs.livedoor.jp/bbs/link.cgi?url=http://www.gihyo.co.jp/book/2000/178901/4-7741-1031-0.pdf
_Yuuka
質問者

補足

大変有難うございます。 > argの一番最初、つまり二番目の引数には呼び出すコマンド名を入れて > おく必要があるそうです。 > execlp("hoge1","hoge1","-lr","hoe","/home/root",NULL); あっ!そうですね。、、と早速試してみましたが $ cat ./test1.c #include<stdio.h> #include <unistd.h> int main(void){ execlp("hoge1","hoge1","-lr","hoe","/home/user01",NULL); return 0; } $ gcc -o test1 test1.c $./test1 $ となりうまくいきません。うーむ。 一応、 execlp関数というのは //test2.c #include<stdio.h> int main(int argc,char* argv[]){ printf("command name = %s\n",argv[0]); return 01; } //test3.c #include<stdio.h> int main(){ execlp("test2","Linux",NULL); return 0; } にて $ ./test2 command name=./test2 $ ./test3 command name=Linux という振舞いで分かる通り、 execlp関数の第二引数は(コマンドになっている)第1引数test2をLinuxというコマンド名に挿げ替えて実行できる機能ですよね。 勘違いしてますかね。

回答No.3

test1.cについて execlp関数のマニュアルをよく読んでコーディングしてみてください。引数の終端がNULLでなければならないことが書いてあるはずです。可変長引き数関数なので終端を判定する手段が必要になります。 両方のプログラムについて 必要なヘッダファイルがincludeされていませんね。正しく引数が渡されていないかもしれません。

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/exec.3.html
_Yuuka
質問者

補足

こんにちは。 お手数お掛けしています。 > test1.cについて > execlp関数のマニュアルをよく読んでコーディングしてみてください。 > 引数の終端がNULLでなければならないことが書いてあるはずです。 仰る通りご紹介いただいたサイトに説明がありました。 > 可変長引き数関数 > なので終端を判定する手段が必要になります。 $ cat ./test1.c #include<stdio.h> #include <unistd.h> int main(void){ execlp("hoge1","-lr","hoe","/home/user01",NULL); return 0; } $ cat ./hoge1.c #include<stdio.h> #include<string.h> int main(int argc,char *argv[]){ char temp[256]; sprintf(temp,"grep %s %s %s", argv[1],argv[2],argv[3]); system(temp); return 0; } $ ./test1 $ となってしまいます。一応、これでいいんですよね? > 必要なヘッダファイルがincludeされていませんね。正しく引数が渡さ > れていないかもしれません。 > > 参考URL:http://www.linux.or.jp/JM/html/LDP_man-pages/ma... #include <unistd.h> が必要だったのですかね。コンパイルエラーが出なかったのでヘッダの問題とは気にも止めませんでしたが。

  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.2

あらかじめargvから適当な文字列を生成して、それをsystem関数に渡す必要がありますね。 自動では展開されません。 char temp[256]; sprintf(temp,"grep %s %s %s", argv[1],argv[2],argv[3]"); sytem(temp); ちなみにargv[0]には実行ファイル名(hoge1)が格納されています。

_Yuuka
質問者

補足

大変有難うございます。 > ちなみにargv[0]には実行ファイル名(hoge1)が格納されています。 #include<stdio.h> #include<string.h> int main(int argc,char *argv[]){ char temp[256]; sprintf(temp,"grep %s %s %s", argv[1],argv[2],argv[3]); system(temp); return 0; } で $ ./hoge1 -lr hoe /home/user01 として 「grep -lr hoe /home/user01」 が実行されました。 $ which grep /bin/grep $ ./test1 $ となってしまいます。 これは何が原因なのでしょうか?

回答No.1

hoge1.cのコンパイル結果が、単体で正しく動作しているか確認してみたらどうですか? hoge1に、test1が渡すのと同じパラメータをつけて実行すると正しい結果が得られていますか? 正しい結果が得られない原因がどちらにあるかわかるはずです。

_Yuuka
質問者

補足

たいへんありがとうございます。 > いますか? $./hoge1 -lr foo /home/user01 sh: line 1: grep,argv[0],argv[1],argv[2]: command not found となりました。 > 正しい結果が得られない原因がどちらにあるかわかるはずです。 という事は system("grep,argv[0],argv[1],argv[2]"); が問題なのですね。

関連するQ&A