stdin处理后恢复

时间:2017-11-20 21:04:08

标签: c shell stdin restore

我有一个功能。我使用pipe(),然后使用stdinstdout更改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应该处理输入,这是一个字符串,但它只是终止而不处理任何事情。怎么了?

0 个答案:

没有答案