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中作为第一个参数。谢谢。