- ベストアンサー
プログラミングの課題でシェルプログラミングが出たのですが・・・全くわけがわからないので助言を…
先日学校でプログラミングの課題が出たのですが、いきなり説明もなく出されたためにまったく理解ができなくて非常に困っています。 内容はシェルプログラミングでプログラムを実行しろというモノですが、まだプログラミングを始めて幼いものでして、何が何やら理解できていないというのが現状です。 詳しい内容は #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <stdlib.h> #include <string.h> main(int argc, char *argv[]) { int len, pid, st; static char prompt[64]="> "; char command[256]; printf("%s",prompt); while (fgets(command, 256, stdin) != NULL){ if ((len = strlen(command)) == 1) break; command[len-1] = '\0'; if((pid = fork()) == 0) { if (execl(command,command,(char *)0)==(-1)){ printf("%s", "exec error.\n"); exit(1); } } else if(pid >= 1) { wait(&st); printf("%s", prompt); } else { perror("fork"); exit(1); } } exit(0); } というプログラム(自作なのであってるかは…)なのですが、これにはコマンドに引数があると、exec() でエラーになるという欠点があります。また、パス検索機能も指定されていないので、コマンドはフルパスで入力してあります。そこで問題なのですが、パス検索機能を追加するとともに、コマンドに引数があっても、exec() でプログラムが正常に実行できるように改良しろ。という内容の問題です。 上記のようにプログラムを作ることまではできたのですが、その先ができません。なんとかできるようにはできないでしょうか? ぜひ時間のある方回答お願いします。
- みんなの回答 (1)
- 専門家の回答
みんなが選んだベストアンサー
パス検索機能、コマンドに引数 の両方を満足させるのはexecvpを使ってやれば多分十分ですよね。 と言う事で if (execl(command,command,(char *)0)==(-1)){ を if (execvp(p[0],p)==(-1)){ に変更して、あとはこのpを上手く作ってやればいいでしょう。それは 適当なところに #define MAX_ARGC 16 と int i; char *p[MAX_ARGC], *tok=" "; と p[0]=strtok(command, tok); for (i=1; i<MAX_ARGC; i++) { if ((p[i]=strtok(NULL, tok))==NULL) break; } を入れるとOKでしょう。
お礼
ご回答本当にありがとうございます。 おかげさまでなんとか解決できました。 またこの手の質問を出してしまうかもしれないのでその時はまた機会があればよろしくお願いします。