繁体   English   中英

C外壳中的多个管道

[英]multiple piping in C shell

谁能告诉我这段代码有什么问题。 我能够成功地写入管道,但是当我将管道输出端用作另一个命令的输入时,却无法获得输出。 下面是代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>     //for pid_t fork() and other system calls
#include <signal.h>     //for signal()
#include <sys/types.h>


void command_EXECUTER(char *args[]);
void command_HANDLER(char *args[]);
int pipe_EXECUTER(char *args[], int in, int pos);

void shell_INIT(){

    int is_interactive = isatty(STDOUT_FILENO);

    if(is_interactive){



    }

}

int main(int argc, char *argv[], char **envp){

    char shell_INPUT[1024];
    char *tokens[256];
    int tok_counts = 0;

    while(1){

        memset(shell_INPUT,'\0',sizeof(shell_INPUT));

        printf("\n%s@%s: ",getenv("USER"),getenv("SESSION"));
        fgets(shell_INPUT,1024,stdin);

        if((tokens[0] = strtok(shell_INPUT," \n)\t")) == NULL) continue;

        tok_counts = 1;

        while((tokens[tok_counts] = strtok(NULL, " \n\t")) != NULL) tok_counts++;
        /*
        int i=0;
        while(tokens[i]){
            printf("%s ",tokens[i]);
            i++;
        }
        tokens[tok_counts] = NULL;*/
        command_HANDLER(tokens);

    }


    return 0;
}

int fileIO_EXECUTER(char *args[], int in, int pos){
    int fd;
    pid_t pid;

    if((pid=fork())==0){
        switch(pos){

            case 0: 
                    dup2(fd, STDOUT_FILENO);
                    break;


        }
    }
}

int pipe_EXECUTER(char *args[], int in, int pos){

    int fd[2];
    pid_t pid;
    pipe(fd);

    if((pid=fork())==0){
        printf("%s %s %s %d\n",args[0],args[1],args[2],pid);
        fflush(stdout);
        switch(pos){

            case 0: dup2(fd[1], STDOUT_FILENO);     //first command
                    //close(fd[1]);
                    break;

            case 1: dup2(in, STDIN_FILENO);             //in between command
                    dup2(fd[1], STDOUT_FILENO);
                    //close(fd[1]);
                    break;

            case 2: dup2(in, STDIN_FILENO);         //last command
                    //close(fd[1]);
                    break;

            default: printf("wrong input variable\nexiting");
                     exit(1);   

        }
        if(execvp(args[0],args)==-1) printf("%s: command not found",args[0]); fflush(stdout); kill(getpid(),SIGTERM);

    }else if(pid<0){
        printf("couldn't create child");
        exit(1);
    }else{
        wait(pid);
    }

    return fd[0];

}

void command_EXECUTER(char *args[]){

    pid_t pid;

    if((pid=fork())<0){
        printf("couldn't create the child");
        exit(1);
    }
    else if(pid==0){

        if((execvp(args[0],args))==-1) printf("%s: command not found",args[0]); fflush(stdout); kill(getpid(),SIGTERM);
    }
    else wait(pid);

}

void command_HANDLER(char *args[]){

    int i=0;
    int j=0;
    char spec_chars[100];

    while(args[i]){
        if((strcmp(args[i],">")==0) || (strcmp(args[i],"<")==0) || (strcmp(args[i],"|")==0) || (strcmp(args[i],"&")==0) || (strcmp(args[i],"$")==0)){
            spec_chars[j] = *args[i];
            j++;
        }
        i++;
    }

    if(j==0){
        if(strcmp(args[0],"exit")==0) exit(0);
        else if(strcmp(args[0],"clear")==0) system("clear");
        else command_EXECUTER(args);
    }
    else{

        int in = 0;
        int h = 0;
        int pos=0;
        char data[1024];
        int k=i;
        i = 0;
        while(args[i]){
            if(strcmp(args[i],"|")==0){
                args[i] = (char *)NULL;
                in = pipe_EXECUTER(args,in,pos);
                int n = read(in,data,sizeof(data));
                printf("%s %d\n",data,n);
                fflush(stdout);
                args = args+i+1;

                //printf("%s something %s",args[0],args[1]);
                pos = 1;
                i=0;
            }else if(strcmp(args[i],"<")==0){


            }else if(strcmp(args[i],">")==0){

            }else if(strcmp(args[i],"&")==0){

            }
            else{
                i++;
            }

        }
        in = pipe_EXECUTER(args,in,2);
    }

}

例如,如果我使用

ls | 分类

'in'描述符中将包含ls,但是当通过'sort'访问相同的输出时,它将挂在那里...否则执行该命令的子代永远不会死亡,并且由于该父代一直在等待。

“在”描述符中将包含ls,但是当通过“ sort”访问相同的输出时,它将挂在那里

这是由于未在父进程中关闭管道的写端而造成的,因为sort自然会一直等到所有引用写端的文件描述符都被关闭,从而确保不再有输入到达。 因此,在pipe_EXECUTER() ,必须在return fd[0];之前调用close(fd[1]) return fd[0]; 当然还有调试代码

                int n = read(in,data,sizeof(data));
                printf("%s %d\n",data,n);

必须删除command_HANDLER()中的内容,以免将输入用于sort

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM