我正在try 用C语言编写一个支持多管道进程处理的shell ,这取决于用户给出的独立进程的数量,每个进程都用"|"符号分隔.shell 将进程的数量Forking 到每个进程的子进程中.

下面是一个例子:

texto1.txt = "Isto é o Texto 1"

$ cat texto1.txt | grep -c Isto 

结果:1

但我在子元素之间的沟通以及最终与父母进程的沟通方面遇到了困难.

下面是我当前的execpipe函数代码,它执行管道进程,argv1argv2是由用户输入给出的两个单独的进程:(示例:ls -l | wc -l)

int execpipe(char ** argv1, char  ** argv2)
{
    int fds[2];
    pipe(fds);
    int i;
    pid_t p1, p2;
    p1 = fork();
    if (p1 == -1)
    { // error
        char * error = strerror(errno);
        printf("error fork!!\n");
        return 1;
    }
    if (p1 == 0)
    { // child process

        close(fds[0]);
        dup2(fds[1], STDOUT_FILENO);
        close(fds[1]);
        if(execvp(argv1[0], argv1)<0){ // run command AFTER pipe character in userinput
            char * error = strerror(errno);
            printf("unknown command\n");
            return 0;
        }
    }
    else
    { // parent process
        p2 = fork();

        if(p2==0){
            close(fds[1]);
            dup2(fds[0], STDIN_FILENO);
            close(fds[0]);
            if(execvp(argv2[0], argv2)<0){ // run command AFTER pipe character in userinput
                char * error = strerror(errno);
                printf("unknown command\n");
                return 0;
            }
        }else{ //Parent waits for both of it's children
            wait(NULL);
            wait(NULL);
        }
    }
}

推荐答案

父进程must关闭管道的写入端以指示不再有数据到来的第二进程:

            }
        }else{ //Parent waits for both of it's children
            close(fds[1]); // ++ add this line
            wait(NULL);
            wait(NULL);
        }

小提示:而不是

        char * error = strerror(errno);
        printf("error fork!!\n");

好呀

        perror("fork");

C++相关问答推荐

为什么下面的C代码会进入无限循环?

不同到达时间的轮询实现

VS代码C/C++扩展intellisense无法检测环境特定函数'

C中的__attributor__((aligned(4),packed))与 struct 的用法

正在try 将文件/文件夹名从目录 struct 存储到链接列表

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

在C++中使用函数指针的正确语法

错误:包含文件时类型名称未知

防止C++中递归函数使用堆栈内存

接受任何参数的函数指针是否与接受不同参数的函数兼容

Cairo STM32MP1 cairo_Surface_WRITE_TO_PNG始终返回CAROLIO_STATUS_WRITE_ERROR

CS50判断灯泡运动的问题,判断时多出一个灯泡,但不在终端上

传递给函数的 struct 中的数组

使用mmap为N整数分配内存

Linux Posix消息队列

在Ubuntu上使用库部署C程序的最佳实践

为什么 int32_t 和 int16_t 在 printf 输出中具有相同的位数?

nullptr_t 是否会 destruct 类型双关或指针转换?

int 与 size_t 与 long

在 printf() 格式说明符中使用字段宽度变量