n 管道函数修正

问题描述 投票:0回答:1

我已经尝试学习 Linux 内部结构一个月了,我尝试为 n+1 个函数创建 n 个管道,但出了问题,而且我不知道出了什么问题。所以,我在大家的关注下提交了我的代码,我需要有人帮助我

int main(int argc, char *argv[])
{
    int i = 0,pp[5],j = 0,fd[2];
    pipe(fd);
    while(argv[i])
    {
        if(!strcmp(argv[i],"|"))
        {
            argv[i] = '\0';
            pp[j++] = i;
        }
        i++;
    }

    for(int i = 0;i < j;i++)
    {
        if(i < j-1)
            pid_t pid = fork();
        if(pid)
        {
            int stat;
            wait(&stat);
            dup(fd[1]);
            close(fd[1]);
            close(0);
            dup(fd[0]);
            execvp(argv[pp[i]+1],argv + (pp[i]+1));
        }
        else
        {
            dup(fd[0]);
            close(fd[0]);
            close(1);
            dup(fd[1]);
            execvp(argv[pp[i]],argv + pp[i]);
        }
    }
}
c linux pipe
1个回答
0
投票
        if(pid)
        {
            // ...
            execvp(argv[pp[i]+1],argv + (pp[i]+1));
        }
        else
        {
            // ...
            execvp(argv[pp[i]],argv + pp[i]);
        }

n 必须为 1。

我建议你从头开始重建你的算法。类似于(伪代码)

set argmarker = 0
for each argument
   if argument == "|"
      create pipe
      create child process
      if child process
         dup2 pipe output to handle 1
         close pipe handles
         exec()
      dup2 pipe input to handle 0
      close pipe handles
      set argmarker = next argument
if any arguments left
   exec()

我还省略了错误处理;你需要检查 pipeline()、fork() 或 exec() 是否失败。

© www.soinside.com 2019 - 2024. All rights reserved.