質問編集履歴

8

argsをprintfで出力した結果を補足

2021/07/11 13:24

投稿

SUNMOON_14
SUNMOON_14

スコア20

test CHANGED
File without changes
test CHANGED
@@ -280,4 +280,14 @@
280
280
 
281
281
  ```
282
282
 
283
+ 以下のように,argsにはきちんと格納されていることが分かりました.
284
+
285
+ ```
286
+
287
+ > cd /home
288
+
289
+ args[0] = [cd]
290
+
283
- 追記依頼の欄にコードを追記しました.21:23
291
+ args[1] = [/home]
292
+
293
+ ```

7

補足

2021/07/11 13:24

投稿

SUNMOON_14
SUNMOON_14

スコア20

test CHANGED
File without changes
test CHANGED
@@ -280,4 +280,4 @@
280
280
 
281
281
  ```
282
282
 
283
- 追記依頼の欄にコードを追記しました.
283
+ 追記依頼の欄にコードを追記しました.21:23

6

補足

2021/07/11 12:23

投稿

SUNMOON_14
SUNMOON_14

スコア20

test CHANGED
File without changes
test CHANGED
@@ -279,3 +279,5 @@
279
279
  }
280
280
 
281
281
  ```
282
+
283
+ 追記依頼の欄にコードを追記しました.

5

配布されたプログラムのソースを追加

2021/07/11 12:09

投稿

SUNMOON_14
SUNMOON_14

スコア20

test CHANGED
File without changes
test CHANGED
@@ -57,3 +57,225 @@
57
57
  ```
58
58
 
59
59
  が正常に動作しているためです.
60
+
61
+
62
+
63
+ ## 配布されたプログラム
64
+
65
+ ```C
66
+
67
+ #include <stdio.h>
68
+
69
+ #include <stdlib.h>
70
+
71
+ #include <sys/types.h>
72
+
73
+ #include <unistd.h>
74
+
75
+ #include <sys/wait.h>
76
+
77
+ #include <string.h>
78
+
79
+
80
+
81
+ #define BUFLEN 1024
82
+
83
+ #define MAXARGNUM 256
84
+
85
+
86
+
87
+ int parse(char [], char *[]);
88
+
89
+ void execute_command(char *[], int);
90
+
91
+
92
+
93
+ int main(int argc, char *argv[])
94
+
95
+ {
96
+
97
+ char command_buffer[BUFLEN];
98
+
99
+ char *args[MAXARGNUM];
100
+
101
+ int command_status;
102
+
103
+
104
+
105
+ for(;;) {
106
+
107
+
108
+
109
+ printf("Command : ");
110
+
111
+
112
+
113
+ if(fgets(command_buffer, BUFLEN, stdin) == NULL) {
114
+
115
+ printf("\n");
116
+
117
+ continue;
118
+
119
+ }
120
+
121
+
122
+
123
+ command_status = parse(command_buffer, args);
124
+
125
+
126
+
127
+ if(command_status == 2) {
128
+
129
+ printf("done.\n");
130
+
131
+ exit(EXIT_SUCCESS);
132
+
133
+ } else if(command_status == 3) {
134
+
135
+ continue;
136
+
137
+ }
138
+
139
+
140
+
141
+ execute_command(args, command_status);
142
+
143
+ }
144
+
145
+
146
+
147
+ return 0;
148
+
149
+ }
150
+
151
+
152
+
153
+ int parse(char buffer[],
154
+
155
+ char *args[])
156
+
157
+ {
158
+
159
+ int arg_index;
160
+
161
+ int status;
162
+
163
+
164
+
165
+ arg_index = 0;
166
+
167
+ status = 0;
168
+
169
+
170
+
171
+ *(buffer + (strlen(buffer) - 1)) = '\0';
172
+
173
+
174
+
175
+ if(strcmp(buffer, "exit") == 0) {
176
+
177
+
178
+
179
+ status = 2;
180
+
181
+ return status;
182
+
183
+ }
184
+
185
+
186
+
187
+ while(*buffer != '\0') {
188
+
189
+
190
+
191
+ while(*buffer == ' ' || *buffer == '\t') {
192
+
193
+ *(buffer++) = '\0';
194
+
195
+ }
196
+
197
+
198
+
199
+ if(*buffer == '\0') {
200
+
201
+ break;
202
+
203
+ }
204
+
205
+
206
+
207
+ args[arg_index] = buffer;
208
+
209
+ ++arg_index;
210
+
211
+
212
+
213
+ while((*buffer != '\0') && (*buffer != ' ') && (*buffer != '\t')) {
214
+
215
+ ++buffer;
216
+
217
+ }
218
+
219
+ }
220
+
221
+
222
+
223
+ args[arg_index] = NULL;
224
+
225
+
226
+
227
+ if(arg_index > 0 && strcmp(args[arg_index - 1], "&") == 0) {
228
+
229
+
230
+
231
+ --arg_index;
232
+
233
+ args[arg_index] = '\0';
234
+
235
+ status = 1;
236
+
237
+
238
+
239
+ } else {
240
+
241
+
242
+
243
+ status = 0;
244
+
245
+
246
+
247
+ }
248
+
249
+
250
+
251
+ if(arg_index == 0) {
252
+
253
+ status = 3;
254
+
255
+ }
256
+
257
+
258
+
259
+ return status;
260
+
261
+ }
262
+
263
+
264
+
265
+ void execute_command(char *args[],
266
+
267
+ int command_status)
268
+
269
+ {
270
+
271
+ int pid;
272
+
273
+ int status;
274
+
275
+ [ your program ]
276
+
277
+ return;
278
+
279
+ }
280
+
281
+ ```

4

補足

2021/07/11 11:36

投稿

SUNMOON_14
SUNMOON_14

スコア20

test CHANGED
File without changes
test CHANGED
@@ -22,7 +22,7 @@
22
22
 
23
23
  ## 質問
24
24
 
25
- このとき,args[0]が指す文字列を得るにはどのようにプログラムを書けばよいでしょうか?
25
+ このとき,args[1]が指す文字列を得るにはどのようにプログラムを書けばよいでしょうか?
26
26
 
27
27
 
28
28
 

3

補足

2021/07/11 10:44

投稿

SUNMOON_14
SUNMOON_14

スコア20

test CHANGED
File without changes
test CHANGED
@@ -48,6 +48,8 @@
48
48
 
49
49
  配布されたコードを用いていることと,
50
50
 
51
+ ls -lを与えたときに通る行である,
52
+
51
53
  ```C
52
54
 
53
55
  execvp(*args, args);

2

補足

2021/07/11 10:28

投稿

SUNMOON_14
SUNMOON_14

スコア20

test CHANGED
File without changes
test CHANGED
@@ -43,3 +43,15 @@
43
43
  おそらくargs[1]などとしてはいけないのだと推測します.
44
44
 
45
45
  ls -lなどのコマンドは使えているため,入力→切り出し→格納などはうまくいっているものと考えられます.
46
+
47
+
48
+
49
+ 配布されたコードを用いていることと,
50
+
51
+ ```C
52
+
53
+ execvp(*args, args);
54
+
55
+ ```
56
+
57
+ が正常に動作しているためです.

1

補足

2021/07/11 10:23

投稿

SUNMOON_14
SUNMOON_14

スコア20

test CHANGED
File without changes
test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
  ```
40
40
 
41
- のようにして入力をcd /homeなどとすると,条件分岐に引っ掛かってしまいます.
41
+ のようにして入力をcd /homeなどとすると,条件分岐に引っ掛かってしまいます(chdir(args[1]) = -1となるということ)
42
42
 
43
43
  おそらくargs[1]などとしてはいけないのだと推測します.
44
44