外壳中的多个管道

发布于 2025-02-11 16:59:30 字数 1532 浏览 1 评论 0原文

我试图复制bash的多个管道执行,而我却没有从终端获得输出。首先,我创建程序需要根据命令的数量来创建所需的管道数,另一方面,如果它是最后一个命令,我不会从任何管道上读取,我不会将输出重定向到任何管道。我打印了每个FD以检查我的程序是否做得很好,而且看起来还不错,但是正如我所说的那样,我没有得到最后命令的任何输出。

这是我的代码片段,内容涉及我如何处理过程和管道,如果您需要更多的东西,请告诉我。

int i;
int *pipes;

i = 0;
pipes = ft_calloc(sizeof(int), gdata->n_pipes * 2);
while (i < gdata->n_pipes)
{
    pipe(pipes + (i * 2));
    i++;
}
int cc = 0; //command count
int r = 0;  
int m;
pid_t pid;
while (gdata->cmds[r])  //double pointer array that contains the commands to execute ex: [["ls -l"], ["grep i"], ["wc -l"]]
{
    pid = fork();
    if (pid < 0)
    {
        perror("Fork: ");
        exit(EXIT_FAILURE);
    }
    if (pid == 0)
    {
        if (r > 0)
        {
            if (dup2(pipes[(cc - 1) * 2], STDIN_FILENO) < 0)
            {
                perror("dup");
                exit(EXIT_FAILURE);
            }
        }
        if (r < gdata->commands - 1)
        {
            if (dup2(pipes[cc * 2 + 1], STDOUT_FILENO) < 0)
            {
                perror("dup");
                exit(EXIT_FAILURE);
            }
        } 
        int k = 0;
        while (k < gdata->n_pipes * 2)
        {
            close(pipes[k]);
            k++;
        }
        handle_path(gdata->cmds[r], gdata->envp); // function that calls execve to execute commands
    }
    waitpid(pid, &m, 0);
    r++;
    cc++;
}
int y = 0;  
while (y < gdata->n_pipes * 2)
{
    close(pipes[y]);
    y++;
}

您知道我做错了什么,谢谢您的帮助!

Im trying to replicate the multiple pipes execution of bash, and Im getting no output from terminal. First I create the number of pipes that my program will need depending on the number of commands, then in a while loop I launch each process executing each command in the child proccess and working with the correct FDs of pipes, in case it is first command, I dont read from any pipe, on the other hand, in case it is last command, I dont redirect the output to any pipe. I printed each fd to check if my program is doing well and it looks everything okay but as I said I dont get any output of the last commands.

Here is a snippet of my code about how I deal with the process and the pipes, if you need something more just let me know.

int i;
int *pipes;

i = 0;
pipes = ft_calloc(sizeof(int), gdata->n_pipes * 2);
while (i < gdata->n_pipes)
{
    pipe(pipes + (i * 2));
    i++;
}
int cc = 0; //command count
int r = 0;  
int m;
pid_t pid;
while (gdata->cmds[r])  //double pointer array that contains the commands to execute ex: [["ls -l"], ["grep i"], ["wc -l"]]
{
    pid = fork();
    if (pid < 0)
    {
        perror("Fork: ");
        exit(EXIT_FAILURE);
    }
    if (pid == 0)
    {
        if (r > 0)
        {
            if (dup2(pipes[(cc - 1) * 2], STDIN_FILENO) < 0)
            {
                perror("dup");
                exit(EXIT_FAILURE);
            }
        }
        if (r < gdata->commands - 1)
        {
            if (dup2(pipes[cc * 2 + 1], STDOUT_FILENO) < 0)
            {
                perror("dup");
                exit(EXIT_FAILURE);
            }
        } 
        int k = 0;
        while (k < gdata->n_pipes * 2)
        {
            close(pipes[k]);
            k++;
        }
        handle_path(gdata->cmds[r], gdata->envp); // function that calls execve to execute commands
    }
    waitpid(pid, &m, 0);
    r++;
    cc++;
}
int y = 0;  
while (y < gdata->n_pipes * 2)
{
    close(pipes[y]);
    y++;
}

Do you have any idea what I'm doing wrong, Thanks for the help!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文