C言語の問題で、 どうしても分からないため どなたか教えてください。

C言語の問題で、 どうしても分からないため どなたか教えてください。 問題は、fork()、exec()システムコールを利用して、 UNIXのコマンドを入力して、 そのコマンドを実行するプログラムを教えてください。 親プロセスは、実行すべきコマンドを入力された後、 fork()システムコールを使用して 小プロセスを起動します。 小プロセスでは、 ①コマンドの実行結果を標準入力へ出力 ②コマンドの実行結果をファイルへ出力(ファイル名はsample.out) ①を指定した場合、 コマンドの実行結果は標準出力(画面)へ出力し、 ②を指定した場合は、 コマンドの実行結果をファイルへ出力します。 実行結果は、 $./sample Input command : ls -l ← Output Result for 1.Stdout 2.File Which Number ? : 1 ← ----- Result ----- total 20 -rw-r--r-- 1 xxxx xxx xxx Dec 10 12:00 filea $ $./sample Input command : ps -j ← Output Result for 1.Stdout 2.File Which Number ? : 2 ← $ $cat sample.out ----- Result ----- USER PID PPID PGID SESS JOBC STAT TT TIME COMMAND xxxx xxx xxx xxx xxx xxx xxx xx xxx xxxxxx $ 矢印(←)が入力データです。

C言語関連146閲覧xmlns="http://www.w3.org/2000/svg">50

ベストアンサー

このベストアンサーは投票で選ばれました

0

特に指定されてないから execvp() 使ったけど、入力の parse は手抜きなんで /bin/sh 経由も用意しといた。こっちを有効にするときは #if 0 を #if 1 に変更 コマンドラインから ./a.out 2 ls -i / とかも可能、というかそっちの方が簡単 何か説明が必要なら補足してください #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <ctype.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.h> #include <err.h> main(int argc, char *argv[]) { int n = 0, i; pid_t pid; char buf[1024], *p, *cmdv[] = {"/bin/sh", "-c", buf, NULL}; if (argc >= 3) { n = atoi(argv[1]); argv += 2, argc -= 2; } else { printf("Input command :"); if (!fgets(buf, sizeof(buf), stdin)) exit(0); buf[sizeof(buf)-1] = '\0'; #if 0 argv = cmdv, argc = sizeof(cmdv)/sizeof(*cmdv) - 1; #else for (argc = 1, p = buf; *p; p++) if (isspace(*p)) { while (isspace(*++p)) ; ++argc, p--; } argv = malloc((argc+1) * sizeof(*argv)); if (!argv) err(1, "malloc"); for (argv[i = 0] = p = buf; *p; p++) if (isspace(*p)) { *p = '\0'; while (isspace(*++p)) ; argv[++i] = p--; } if (*argv[i]) i++; else --argc; argv[i] = NULL; #endif printf("Output Result for 1.Stdout 2.File\nWhich Number ?"); scanf(" %d", &n); } /* for (i = 0; i < argc; i++) printf("%d:%s\n", i, argv[i]); */ if ((pid = vfork()) < 0) err(1, "vfork"); if (pid == 0) { if (n > 1) { close(1); i = open("sample.out", O_WRONLY | O_CREAT | O_TRUNC, 0644); if (i < 0) err(1, "open"); } execvp(*argv, argv); warn("execvp: %s", *argv); _exit(1); } if (wait(&i) < 0) err(1, "wait"); exit(WEXITSTATUS(i)); }