unix minishell char成** char

时间:2016-04-20 12:18:03

标签: c++ arrays pointers char

所以基本上我想做的事情:

如果我写

  

你好我在这里

char command[20]应为' Hello '(该部分有效),而char *parameters应该有指向' Hello ''我''上午''此处'' NULL '。

对于' Hello '部分,我刚使用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);
    }
}
}

1 个答案:

答案 0 :(得分: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逐步执行命令字符串,随时保存每个参数的位置。 你正在修改命令字符串以使用空终止符替换''分隔符,随时切断输入字符串。