Linux シェルを構築していますが、現在の頭痛の種は、コマンド ライン引数を fork/exec されたプログラムとシステム関数に渡すことです。
現在、すべての入力は、グローバル変数 char * parsed_arguments 内のスペースと改行でトークン化されています。たとえば、入力ディレクトリ /usa/folderbは次のようにトークン化されます。
parsed_arguments[0] = dir
parsed_arguments[1] = /usa/folderb
parsed_arguments はすべてを完全にトークン化します。私の問題は、シェルで実行するコマンド/最初の引数/実行可能ファイルへのパスを除外するparsed_argumentsのサブセットのみを取得し、それらをpassed_argumentsと呼ばれる新しい配列に保存することです。
前の例ではdir /usa/folderb
parsed_arguments[0] = dir
parsed_arguments[1] = /usa/folderb
passed_arguments[0] = /usa/folderb
passed_arguments[1] = etc....
現在、私はこれで運が悪いので、誰かが私を助けてくれることを願っています. ここに私がこれまでに取り組んできたことのいくつかのコードがあります:
引数をコピーしようとしている方法:
void command_Line()
{
int i = 1;
for(i;parsed_arguments[i]!=NULL;i++)
printf("%s",parsed_arguments[i]);
}
コマンドを読み取る関数:
void readCommand(char newcommand[]){
printf("readCommand: %s\n", newcommand);
//parsed_arguments = (char* malloc(MAX_ARGS));
// strcpy(newcommand,inputstring);
parsed = parsed_arguments;
*parsed++ = strtok(newcommand,SEPARATORS); // tokenize input
while ((*parsed++ = strtok(NULL,SEPARATORS)))
//printf("test1\n"); // last entry will be NULL
//passed_arguments=parsed_arguments[1];
if(parsed[0]){
char *initial_command =parsed[0];
parsed= parsed_arguments;
while (*parsed) fprintf(stdout,"%s\n ",*parsed++);
// free (parsed);
// free(parsed_arguments);
}//end of if
command_Line();
}//end of ReadCommand
分岐機能:
else if(strstr(parsed_arguments[0],"./")!=NULL)
{
int pid;
switch(pid=fork()){
case -1:
printf("Fork error, aborting\n");
abort();
case 0:
execv(parsed_arguments[0],passed_arguments);
}
}
これは私のシェルが現在出力しているものです。初めて実行すると、必要なものに近いものが出力されますが、その後のすべての呼び出しでプログラムが壊れます。さらに、追加の呼び出しごとに、解析された引数が出力に追加されます。
これは、元のシェルが生成するものです。繰り返しますが、それは私が望むものに近いですが、完全ではありません. コマンド (つまり、"./testline") を省略したい。