質問: C言語の問題で、 どうしても分からないため どなたか教えてください。
回答: 特に指定されてないから execvp() 使ったけど、入力の parse は手抜きなんで /bin/sh 経由も用意しといた。こっちを有効にするときは #if 0 を #if 1 に変更 コマンドラインから ./a.out 2 ls -i / とかも可能、というかそっちの方が簡単 何か説明が必要なら補足してください #include #include #include #include #include #include #include #include #include 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)); }