• 締切済み

シェルのプログラム

以下の項目を実現するプログラムを作っています。 コマンドプロンプトを表示し、キーボードからコマンドを文字列として入力する。入力した文字列を調べ、forkして子プロセスを作る子プロセスで、調べたコマンドをexecする、親プロセスは子プロセスの終了を待って、始めに戻るというプログラムです。自分なりにあれこれ作ったのが下のです。 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> void read_command(char *command, char *p) { static char buf[100]; fgets(buf, 100, stdin); sscanf(buf, "%s %[\n]", command,p); } int main(void) { pid_t pid; int status; char command[100], p[100]; while (1) { printf("command>"); read_command(command, p); pid = fork(); if (pid < 0) { printf("forkできません\n"); continue; } if (pid != 0) { wait(&status); } else { execve(command, p, 0); } } return 0; } 子プロセスと親プロセスでのforkの仕方が分かりません。 実行したら下のような結果になるようにしたいのですが、できません。 どなたか、教えてください。 $./sh command> ls a.out ・・・・・・

みんなの回答

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

>execve(command, p, 0); execve()の第二引数はchar *argv[]の形式でなければなりません。その形式にpを加工するか、とりあえずはexeclp()を使うようにするかです。 それに実行に失敗した場合を考慮して、execのあとにexit()をおかなければなりません。 if (0 == pid) { /* child */ if (execlp(command, command, p, NULL) == -1) perror(command); exit(1); } else { /* parent */

回答No.1

fork() の結果が0なら子プロセス、非0(子プロセスのID)なら親プロセスなので: pid_t child_id = fork(); if ( child_id == 0 ) {  /* 子プロセスでやること。   * exec() とか   */ } else {  /* 親プロセスでやること。   * 子プロセスの終了を待つ、とか。   */ }

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man2/fork.2.html

関連するQ&A

専門家に質問してみよう