2016-04-20 49 views
1

所以基本上是我想做的事:UNIX minishell焦炭引入**焦炭

如果我寫

你好,我是這裏

char command[20]應該是 '你好'(這部分作品)和char *parameters應該有一個指針,其點「你好」' '' 這裏 '' NULL 」。

對於'你好'部分我剛剛使用char *com這已經是一個指針。但我真的不知道如何讓剩下的權利。

基本上:execvp想要一個char命令和一個指向數組的指針和所有參數(我希望這部分是正確的)。

我不知道怎麼填*parameters

恐怕答案是真的很明顯:(

在此先感謝

void read_command(char *com, char **par) 
{ 

string Eingabe = " "; 

fprintf(stdout, "$ "); 

getline (cin, Eingabe); 

strcpy(com, Eingabe.substr(0, Eingabe.find(" ")).c_str()); 
*par = com;  

Eingabe.erase(0, Eingabe.find(" ")+1); 

    do 
{ 
par++; 

strcpy(???, Eingabe.substr(0, Eingabe.find(" ")).c_str()); 
Eingabe.erase(0, Eingabe.find(" ")+1); 



}while(); 

return; 
} 




int main() 
{ 
int childPid; 
int status; 
char command[20]; 
char *parameters[60]; 

while(1) 
{ 

    read_command(command, parameters); 

    if((childPid = fork()) == -1) 
    { 
    fprintf(stderr, "can't fork\n"); 
    exit(1); 
    }else if(childPid == 0) 
    { 
    execvp(command, parameters); 
    exit(0); 
    }else 
    { 
    waitpid(childPid, &status, WUNTRACED | WCONTINUED); 
    } 
} 
} 
+0

1)您的DO-而在rea​​d_command缺少的 「而」 表達。 2)你正在混合C++和C風格的字符串操作,對我來說看起來並不直觀。我強烈建議選擇一種風格並堅持下去。 3)拆分串起來,你所希望的方式的操作被稱爲「符號化」 - 嘗試用這個詞搜索。有趣的C函數可能包括strtok和/或strcspn。在C++中,Boost Tokenizer可能會幫助你。 – laughingcoyote

+0

嘿,謝謝你的回答。我將檢查標記化的解決方案,但這不是真正的問題。我的問題不在於字符串的分離,它如何將它們放入char *參數中[60]。 F.e.如果我有一個char,在函數read_command中包含'here',那麼我如何將此char轉換爲char *參數[],以便參數[1] [0]是'h'和[1] [1]會是'e'等等。你的答案 – Soody

回答

0

基本零拷貝C風格的實現可能是這樣的:

#include <string.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <sys/wait.h> 

int main() 
{ 
    char command[20]; 
    char *parameters[60]; 
    int i, childPid, status; 

    while(1) { 
     memset(command, 0, sizeof(command)); 
     memset(parameters, 0, sizeof(parameters)); 

     i = 0; 

     gets(command); 

     parameters[i] = strtok(command, " "); 
     i++; 
     while(parameters[i] = strtok(NULL, " ")) { 
      //turn the space before us into a null terminator 
      *(parameters[i] - 1) = '\0'; 
      i++; 
     } 

     if(childPid = fork()) { //assume success, we're the parent 
      waitpid(childPid, &status, WUNTRACED | WCONTINUED); 
     } 
     else { //we're the child 
      execvp(command, parameters); 
      exit(0); 
     } 
    } 

    return 0; 
} 

你」重新使用strtok來遍歷您的命令字符串,並保存每個參數的位置。您正在修改命令stri在原地用一個空終止符替換一個''分隔符,隨着時間的推移切入輸入字符串。

+0

感謝,程序工作正常後,我加入「#包括」 你的處理輸入命令和參數的方式看起來比我在做它的方式更容易了很多,所以向你表示感謝。 但我真的不想只在main()中有程序,我不得不添加一些功能,然後它可能會有點混亂。 所以我仍然在尋找一個解決方案,其分離。 – Soody