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

質問編集履歴

8

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

2021/07/11 13:24

投稿

SUNMOON_14
SUNMOON_14

スコア20

title CHANGED
File without changes
body CHANGED
@@ -139,4 +139,9 @@
139
139
  return;
140
140
  }
141
141
  ```
142
+ 以下のように,argsにはきちんと格納されていることが分かりました.
143
+ ```
144
+ > cd /home
145
+ args[0] = [cd]
142
- 追記依頼の欄にコードを追記しました.21:23
146
+ args[1] = [/home]
147
+ ```

7

補足

2021/07/11 13:24

投稿

SUNMOON_14
SUNMOON_14

スコア20

title CHANGED
File without changes
body CHANGED
@@ -139,4 +139,4 @@
139
139
  return;
140
140
  }
141
141
  ```
142
- 追記依頼の欄にコードを追記しました.
142
+ 追記依頼の欄にコードを追記しました.21:23

6

補足

2021/07/11 12:23

投稿

SUNMOON_14
SUNMOON_14

スコア20

title CHANGED
File without changes
body CHANGED
@@ -138,4 +138,5 @@
138
138
  [ your program ]
139
139
  return;
140
140
  }
141
- ```
141
+ ```
142
+ 追記依頼の欄にコードを追記しました.

5

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

2021/07/11 12:09

投稿

SUNMOON_14
SUNMOON_14

スコア20

title CHANGED
File without changes
body CHANGED
@@ -27,4 +27,115 @@
27
27
  ```C
28
28
  execvp(*args, args);
29
29
  ```
30
- が正常に動作しているためです.
30
+ が正常に動作しているためです.
31
+
32
+ ## 配布されたプログラム
33
+ ```C
34
+ #include <stdio.h>
35
+ #include <stdlib.h>
36
+ #include <sys/types.h>
37
+ #include <unistd.h>
38
+ #include <sys/wait.h>
39
+ #include <string.h>
40
+
41
+ #define BUFLEN 1024
42
+ #define MAXARGNUM 256
43
+
44
+ int parse(char [], char *[]);
45
+ void execute_command(char *[], int);
46
+
47
+ int main(int argc, char *argv[])
48
+ {
49
+ char command_buffer[BUFLEN];
50
+ char *args[MAXARGNUM];
51
+ int command_status;
52
+
53
+ for(;;) {
54
+
55
+ printf("Command : ");
56
+
57
+ if(fgets(command_buffer, BUFLEN, stdin) == NULL) {
58
+ printf("\n");
59
+ continue;
60
+ }
61
+
62
+ command_status = parse(command_buffer, args);
63
+
64
+ if(command_status == 2) {
65
+ printf("done.\n");
66
+ exit(EXIT_SUCCESS);
67
+ } else if(command_status == 3) {
68
+ continue;
69
+ }
70
+
71
+ execute_command(args, command_status);
72
+ }
73
+
74
+ return 0;
75
+ }
76
+
77
+ int parse(char buffer[],
78
+ char *args[])
79
+ {
80
+ int arg_index;
81
+ int status;
82
+
83
+ arg_index = 0;
84
+ status = 0;
85
+
86
+ *(buffer + (strlen(buffer) - 1)) = '\0';
87
+
88
+ if(strcmp(buffer, "exit") == 0) {
89
+
90
+ status = 2;
91
+ return status;
92
+ }
93
+
94
+ while(*buffer != '\0') {
95
+
96
+ while(*buffer == ' ' || *buffer == '\t') {
97
+ *(buffer++) = '\0';
98
+ }
99
+
100
+ if(*buffer == '\0') {
101
+ break;
102
+ }
103
+
104
+ args[arg_index] = buffer;
105
+ ++arg_index;
106
+
107
+ while((*buffer != '\0') && (*buffer != ' ') && (*buffer != '\t')) {
108
+ ++buffer;
109
+ }
110
+ }
111
+
112
+ args[arg_index] = NULL;
113
+
114
+ if(arg_index > 0 && strcmp(args[arg_index - 1], "&") == 0) {
115
+
116
+ --arg_index;
117
+ args[arg_index] = '\0';
118
+ status = 1;
119
+
120
+ } else {
121
+
122
+ status = 0;
123
+
124
+ }
125
+
126
+ if(arg_index == 0) {
127
+ status = 3;
128
+ }
129
+
130
+ return status;
131
+ }
132
+
133
+ void execute_command(char *args[],
134
+ int command_status)
135
+ {
136
+ int pid;
137
+ int status;
138
+ [ your program ]
139
+ return;
140
+ }
141
+ ```

4

補足

2021/07/11 11:36

投稿

SUNMOON_14
SUNMOON_14

スコア20

title CHANGED
File without changes
body CHANGED
@@ -10,7 +10,7 @@
10
10
  (と理解しています.)
11
11
 
12
12
  ## 質問
13
- このとき,args[0]が指す文字列を得るにはどのようにプログラムを書けばよいでしょうか?
13
+ このとき,args[1]が指す文字列を得るにはどのようにプログラムを書けばよいでしょうか?
14
14
 
15
15
  例(自作cd):
16
16
  ```C

3

補足

2021/07/11 10:44

投稿

SUNMOON_14
SUNMOON_14

スコア20

title CHANGED
File without changes
body CHANGED
@@ -23,6 +23,7 @@
23
23
  ls -lなどのコマンドは使えているため,入力→切り出し→格納などはうまくいっているものと考えられます.
24
24
 
25
25
  配布されたコードを用いていることと,
26
+ ls -lを与えたときに通る行である,
26
27
  ```C
27
28
  execvp(*args, args);
28
29
  ```

2

補足

2021/07/11 10:28

投稿

SUNMOON_14
SUNMOON_14

スコア20

title CHANGED
File without changes
body CHANGED
@@ -20,4 +20,10 @@
20
20
  ```
21
21
  のようにして入力をcd /homeなどとすると,条件分岐に引っ掛かってしまいます(chdir(args[1]) = -1となるということ).
22
22
  おそらくargs[1]などとしてはいけないのだと推測します.
23
- ls -lなどのコマンドは使えているため,入力→切り出し→格納などはうまくいっているものと考えられます.
23
+ ls -lなどのコマンドは使えているため,入力→切り出し→格納などはうまくいっているものと考えられます.
24
+
25
+ 配布されたコードを用いていることと,
26
+ ```C
27
+ execvp(*args, args);
28
+ ```
29
+ が正常に動作しているためです.

1

補足

2021/07/11 10:23

投稿

SUNMOON_14
SUNMOON_14

スコア20

title CHANGED
File without changes
body CHANGED
@@ -18,6 +18,6 @@
18
18
  fprintf(stderr, "No Such Directory\n");
19
19
  }
20
20
  ```
21
- のようにして入力をcd /homeなどとすると,条件分岐に引っ掛かってしまいます.
21
+ のようにして入力をcd /homeなどとすると,条件分岐に引っ掛かってしまいます(chdir(args[1]) = -1となるということ)
22
22
  おそらくargs[1]などとしてはいけないのだと推測します.
23
23
  ls -lなどのコマンドは使えているため,入力→切り出し→格納などはうまくいっているものと考えられます.