gpt4 book ai didi

c - 在 C 中实现管道

转载 作者:IT王子 更新时间:2023-10-29 00:05:13 24 4
gpt4 key购买 nike

我正在尝试在 C 中实现管道。例如 - $ ls |厕所 | 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();
}

关于c - 在 C 中实现管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21914632/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com