状況
現在,C言語にて簡易シェルを作成しようとしています.
以下の変数を用います.
C
1 char command_buffer[BUFLEN]; // コマンド用のバッファ 2 char *args[MAXARGNUM]; // 引数へのポインタの配列
適切に引数の切り出しを行い,
args[0]にはコマンドを表すchar型の配列へのポインタ,args[1], …にはn個のコマンドの引数を表すchar型の配列へのポインタが格納されており,args[n+1]にはNULLが格納されています.
(と理解しています.)
質問
このとき,args[1]が指す文字列を得るにはどのようにプログラムを書けばよいでしょうか?
例(自作cd):
C
1 if(chdir(args[1]) != 0) { 2 fprintf(stderr, "No Such Directory\n"); 3 }
のようにして入力をcd /homeなどとすると,条件分岐に引っ掛かってしまいます(chdir(args[1]) = -1となるということ).
おそらくargs[1]などとしてはいけないのだと推測します.
ls -lなどのコマンドは使えているため,入力→切り出し→格納などはうまくいっているものと考えられます.
∵
配布されたコードを用いていることと,
ls -lを与えたときに通る行である,
C
1 execvp(*args, args);
が正常に動作しているためです.
配布されたプログラム
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <sys/types.h> 4#include <unistd.h> 5#include <sys/wait.h> 6#include <string.h> 7 8#define BUFLEN 1024 9#define MAXARGNUM 256 10 11int parse(char [], char *[]); 12void execute_command(char *[], int); 13 14int main(int argc, char *argv[]) 15{ 16 char command_buffer[BUFLEN]; 17 char *args[MAXARGNUM]; 18 int command_status; 19 20 for(;;) { 21 22 printf("Command : "); 23 24 if(fgets(command_buffer, BUFLEN, stdin) == NULL) { 25 printf("\n"); 26 continue; 27 } 28 29 command_status = parse(command_buffer, args); 30 31 if(command_status == 2) { 32 printf("done.\n"); 33 exit(EXIT_SUCCESS); 34 } else if(command_status == 3) { 35 continue; 36 } 37 38 execute_command(args, command_status); 39 } 40 41 return 0; 42} 43 44int parse(char buffer[], 45 char *args[]) 46{ 47 int arg_index; 48 int status; 49 50 arg_index = 0; 51 status = 0; 52 53 *(buffer + (strlen(buffer) - 1)) = '\0'; 54 55 if(strcmp(buffer, "exit") == 0) { 56 57 status = 2; 58 return status; 59 } 60 61 while(*buffer != '\0') { 62 63 while(*buffer == ' ' || *buffer == '\t') { 64 *(buffer++) = '\0'; 65 } 66 67 if(*buffer == '\0') { 68 break; 69 } 70 71 args[arg_index] = buffer; 72 ++arg_index; 73 74 while((*buffer != '\0') && (*buffer != ' ') && (*buffer != '\t')) { 75 ++buffer; 76 } 77 } 78 79 args[arg_index] = NULL; 80 81 if(arg_index > 0 && strcmp(args[arg_index - 1], "&") == 0) { 82 83 --arg_index; 84 args[arg_index] = '\0'; 85 status = 1; 86 87 } else { 88 89 status = 0; 90 91 } 92 93 if(arg_index == 0) { 94 status = 3; 95 } 96 97 return status; 98} 99 100void execute_command(char *args[], 101 int command_status) 102{ 103 int pid; 104 int status; 105 [ your program ] 106 return; 107}
以下のように,argsにはきちんと格納されていることが分かりました.
> cd /home args[0] = [cd] args[1] = [/home]
回答3件
あなたの回答
tips
プレビュー