char line[BUFFER]; // Line
    char line1[BUFFER];
    char** arg = malloc(sizeof(char)*BUFFER); // Parameters
    char** arg1= malloc(sizeof(char)*BUFFER);

说某人输入:ls -l | grep somethng

我已经使用strtok()逐个解析参数 .

char *token;//Split command into separate strings
        token = strtok(line,"| ");
        int i=0;
    while(token!=NULL){
    arg[i]=token;                                   // cd usr/bin/du
        token = strtok(NULL,"| ");
        i++;
     }

    printf("%s",line1);

我的执行官:

pid_t pid= fork();              //fork child
        if (pid<0) { perror("exec"); exit(1); }
            if(pid==0) // Child
        {
            // close(1);       // Close stdout
                // dup(mypipe[1]);  // Stdout = mypipe[1]
                // close(mypipe[0]); // Close reader
            // execvp(arg1, arg);
            }
else {  
    do{
    //close(0);    // Close stdin
     //   dup(mypipe[1]);   // Stdin = mypipe[1]
     //   close(mypipe[1]); // Close writer
      //  execvp(arg1, arg);
        pid_t wpid=waitpid(pid,&status,WUNTRACED);
    }while(!WIFEXITED(status) && !WIFSIGNALED(status));

printf的输出是arg [0]:ls,arg [1]: - l,arg [2]:grep,arg [3]:某事

因此,参数已准备好输入execvp(char,arg,(char)NULL) .

我虽然使用strncpy(line1,line,BUFFER);并使用“|”进行标记化分隔符,它在开始和结束时返回带有额外空格的**字符(不确定它们是否有问题)

arg [0]:ls -l(空格),arg [1] :(空格)grep某事(可能是空格)

但是execvp的第一个参数必须是* char(编译器错误) . 我如何删除(anyspace)|(anyspace)并获得2 * char类型(ls -l和grep something)以在execvp中作为第一个参数 . 谢谢 .