gpt4 book ai didi

c - 使用 C 实现管道 ("|")(使用 fork )

转载 作者:太空狗 更新时间:2023-10-29 16:54:07 24 4
gpt4 key购买 nike

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

int main(int argc,char **argv)
{
int fd[2];
pid_t childpid;
pipe(fd);
childpid=fork();
if (childpid == -1)
{
perror("Error forking...");
exit(1);
}
if (childpid) /*parent proces*/ //grep .c
{
wait(&childpid); //waits till the child send output to pipe
close(fd[1]);
close(0); //stdin closed
dup2(fd[0],0);
execlp(argv[2],argv[2],argv[3],NULL);

}
if (childpid==0) //ls
{
close(fd[0]); /*Closes read side of pipe*/
close(1); //STDOUT closed
dup2(fd[1],1);
execl(argv[1],NULL);
}
return 0;
}

如果我将命令行参数设置为“ls grep .c”,我应该会显示所有“.c”文件。

伪代码:-我的子进程将运行“ls”,父进程将运行“grep .c”。父进程等待子进程完成,以便子进程写入管道。

测试运行:-

bash-3.1$ ls | grep .c
1.c
hello.c
bash-3.1$ ./a.out ls grep .c
bash-3.1$

为什么会这样?

最佳答案

一个简单的错误:您的 execl 调用实际上应该是 execlp。此外,您可以去掉 waitclose 语句。然后你应该检查execlp的错误代码。

关于c - 使用 C 实现管道 ("|")(使用 fork ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2191414/

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