我正在構建一個Linux Shell,而我目前頭疼的是將命令行參數傳遞給fork/exec'ed程序和系統函數。用命令行參數分叉
當前所有輸入都在空格和新行上標記爲全局變量char * parsed_arguments。例如,輸入DIR/USA/FolderB中將被標記化如:
parsed_arguments[0] = dir
parsed_arguments[1] = /usa/folderb
parsed_arguments一切標記化完美;我現在的問題是,我只希望獲取一部分parsed_arguments,它排除了要在shell中運行的可執行文件的命令/第一個參數/路徑,並將它們存儲在一個名爲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);
}
}
這是我的shell當前輸出的內容。我第一次運行它時,它會輸出接近我想要的東西,但隨後的每次調用都會中斷程序。另外,每個額外的調用都會將分析的參數附加到輸出中。
這是原來的外殼生產什麼。再次,它接近我想要的,但不完全。我想省略該命令(即「./testline」)。
每個命令的參數列表末尾是否有空指針? – 2013-04-20 00:14:04
@JonathanLeffler它們都應該是字符串,最後應該有一個空指針。 – blutuu 2013-04-20 00:15:01
好的;這是一個陷阱避免。在分叉代碼中,這是一個錯字嗎? 'execv(parsed_arguments [0],passed_arguments);'它應該是'execv(parsed_arguments [0],parsed_arguments);'?請注意,如果'execv()'返回,它將失敗,但代碼繼續讓失敗的子繼續。幾乎總是'exit()'或等效的'execv()'失敗後的等價物。並且也建議一條消息。 – 2013-04-20 00:18:18