teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

system の代わりに fork/execvp を使うコードを追加

2020/11/25 04:12

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -77,4 +77,27 @@
77
77
  25 26 27 28 29 30 31 29 30 27 28 29 30 31
78
78
 
79
79
  CAL (Ctrl-D)
80
+ ```
81
+ **追記**
82
+ system ではなく、fork と execvp で書いてみました。
83
+ ```C
84
+ #include <stdio.h> // fgets, printf
85
+ #include <string.h> // strtok
86
+ #include <unistd.h> // execvp, fork
87
+ #include <wait.h> // wait
88
+
89
+ int main(void)
90
+ {
91
+ char line[128], *argv[32] = { "/usr/bin/cal" };
92
+ printf("cal ");
93
+ while (fgets(line, sizeof line, stdin)) {
94
+ int i = 1;
95
+ argv[i] = strtok(line, " \t\n");
96
+ while (i < 31 && argv[i]) argv[++i] = strtok(NULL, " \t\n");
97
+ if (fork() == 0) execvp(argv[0], argv);
98
+ wait(NULL);
99
+ printf("CAL ");
100
+ }
101
+ return 0;
102
+ }
80
103
  ```

1

誤字修正(exex -> exec)

2020/11/25 04:12

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  質問で、「ここに言語名を入力」を「C」で上書きしてください。
2
2
  「ソースコード」を #include <unistd.h> から } までで上書きしてください。
3
3
 
4
- exex の代わりに system ではダメなんですか?
4
+ exec の代わりに system ではダメなんですか?
5
5
  ```C
6
6
  #include <stdio.h> // fgets, sprintf, printf
7
7
  #include <stdlib.h> // system