我有一个功能。我使用pipe()
,然后使用stdin
和stdout
更改close()
和dup()
。我试图保存句柄,但出了点问题。
N个元素在数组**arr
中,它是shell管道的参数数组。 *i
用于索引**arr
中的元素。
int extraFd;
int conveer(char **arr,int * i,int N){
char **args = NULL;
key_t target_pid;
int j = 0,fd[2];
while((*i) < N && strcmp(arr[*i],"|") &&
strcmp(arr[*i],"<") &&
strcmp(arr[*i],">") &&
strcmp(arr[*i],">>") &&
strcmp(arr[*i],"&&") &&
strcmp(arr[*i],"&") &&
strcmp(arr[*i],";") &&
strcmp(arr[*i],"||") &&
strcmp(arr[*i],"(") ){
j++;
args = realloc(args,sizeof(char *) * j);
args[j-1] = arr[*i];
(*i)++;
}
args = realloc(args,sizeof(char *) * (j+1));
args[j] = NULL;
if( (*i) < N && strcmp(arr[(*i)],"|") == 0){
(*i)++;
pipe(fd);
if ( (target_pid = fork() ) ){
close(fd[0]);
dup2(fd[1],1);
close(fd[1]);
execvp(args[0],args);
}
else{
close(fd[1]);
close(0);
dup(fd[0]);
close(fd[0]);
return conveer(arr,i,N);
}
}
else{
if ( target_pid = fork() ){
execvp(args[0],args);
}
else {
close(0);
dup2(extraFd,0);
close(extraFd);
return 1;
}
}
}
...
extraFd = dup(0);
check = conveer(arr,&i,N);
...
函数conveer
应该处理输入,这是一个字符串,但它只是终止而不处理任何事情。怎么了?