当前位置: 首页 > 面试题库 >

在C中实施管道

骆文彬
2023-03-14
问题内容

我正在尝试在C中实现管道-例如- $ ls | wc | wc

我写了以下代码-

#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>

void run_cmd(char *cmd, int* fd_in, int* fd_out)
{
    int c = fork();

    if (c==0)
    {
        if (fd_in != NULL)
        {
            close(fd_in[1]);
            dup2(fd_in[0], 0);
        }
        if (fd_out != NULL)
        {
            close(fd_out[0]);
            dup2(fd_out[1],1);
        }
        execlp(cmd, cmd, NULL);
    }
}

int main(int argc, char **argv)
{
    int fd_1[2], fd_2[2], i;
    pipe(fd_1);
    pipe(fd_2);

    run_cmd(argv[1], NULL, fd_1);

    for( i=2; i<argc-1; i++)
    {
        if (i%2 == 0)
            run_cmd(argv[i], fd_1, fd_2);
        else
            run_cmd(argv[i], fd_2, fd_1);
    }
    if (i%2 == 0)
        run_cmd(argv[i], fd_1, NULL);
    else
        run_cmd(argv[i], fd_2, NULL);
}

使用两个参数可以很好地工作,例如- $./a.out ls wc

但是,当我尝试两个以上的参数时,它将不起作用。

有人可以告诉我我的代码有什么问题吗,或者有其他方法可以做到这一点?


问题答案:

这实际上没有进行错误检查,但是为什么这么复杂?

int main (int argc, char ** argv) {
    int i;

    for( i=1; i<argc-1; i++)
    {
        int pd[2];
        pipe(pd);

        if (!fork()) {
            dup2(pd[1], 1); // remap output back to parent
            execlp(argv[i], argv[i], NULL);
            perror("exec");
            abort();
        }

        // remap output from previous child to input
        dup2(pd[0], 0);
        close(pd[1]);
    }

    execlp(argv[i], argv[i], NULL);
    perror("exec");
    abort();
}


 类似资料:
  • 问题内容: 答案演示:(答案为5月29日上午3:10) GitHub Actual Question before answered:(asked May 22 at 19:53) The title might be not too great but what I want to do is something like this in JavaFX: Question: 我不需要为此写代码。

  • 问题内容: 我正在使用Golang来构建API Rest。我有一个包含很多字段的结构(超过100个),因此我使用了来自客户端的值来分配给该结构,效果很好。 现在,我要避免用户在任何字符串字段中插入Javascript代码,在结构中我定义了bool,strings,byte []和int值。因此,现在我想知道验证这一点的最佳方法是什么。 我正在考虑仅在字符串字段中对结构进行interate并进行如下

  • 在Perl中,使用Moo,可以围绕sub实现sub,它将围绕类中的其他方法。 如何在Raku中实现这种行为,最好使用角色?

  • 我有一个用例,在这个用例中,我必须只执行授权部分。JWT令牌是由另一个服务生成的。我的服务只会消耗那个令牌,它的自定义声明中会有数据。在我的Spring启动应用程序中,我只想在允许用户访问任何应用编程接口之前验证该令牌是否有效。在所有答案中,我可以看到一个身份验证对象是从当前的安全上下文中创建的。在Spring,有没有什么方法可以让我不需要在自定义过滤器中编写这么多不必要的代码,只需编写解析JWT

  • 我正在研究一个包含图像和文本的多模式分类器。我已经开发并成功地实现了两个模型,一个是用于图像的CNN模型,另一个是基于BERT的文本模型。这两个模型的最后一层都是密集的,有n个单元和softmax激活(其中n是类的数量)。Keras提供了不同的合并层,用于合并这些模型的输出向量(https://keras.io/api/layers/merging_layers/)然后就有可能创建一个新的网络,但

  • 问题内容: 我看过几个网站,这些网站向您显示数据库中正在发生的事情的实时更新。一个例子可能是 股票行情实时显示股票价格的网站 显示诸如“其他用户当前正在搜索的内容”之类的数据。 我认为这将涉及某种轮询机制,该机制每隔几秒钟会查询一次数据库并将其呈现在网页上。但是,从性能角度考虑时,这种想法使我感到恐惧。 在我正在处理的应用程序中,我需要显示用户提交的操作的实时状态。用户等待该过程完成。当操作完成时