gpt4 book ai didi

多个子级之间的 C++ 管道

转载 作者:行者123 更新时间:2023-12-03 12:51:48 25 4
gpt4 key购买 nike

我正在开发一个项目,除了一个小(大)问题外,我已经解决了大部分问题。我似乎无法弄清楚如何在任意数量的子级之间创建管道。

例如,我正在接受命令行参数来确定将产生多少个 child 。第一个子级没有输入,但有输出,最后一个子级输出到 STD 输出。我需要按顺序将值传递给第一个 child 和之后的每个 child 。这是我得到的:

#include <errno.h>
#include <cstdio>
#include <iostream>
#include <sys/wait.h>

using namespace std;

int main(int argc, char *argv[]) {
pid_t childpid;
int x2ypipe[2];
pipe(x2ypipe);
if(x2ypipe==0) {
cout<<"ERROR:"<<errno<<endl;
}
int y2zpipe[2];
pipe(y2zpipe);
if(y2zpipe==0) {
cout<<"ERROR:"<<errno<<endl;
}
pid_t xchild =fork();
if(xchild==0) {
dup2(x2ypipe[1],STDOUT_FILENO);
close(x2ypipe[0]);
close(x2ypipe[1]);
int a=execl(argv[1],argv[1], (char*)NULL);
if(a==-1) {
perror("The following error occurred at A");
}
}
for(int i=2; i<(argc-1); i++) {
childpid =fork();
if(childpid==0) {
dup2(x2ypipe[0],STDIN_FILENO);
close(x2ypipe[0]);
close(x2ypipe[1]);
//direct y2z pipe to standard output and replace the child with the program part2
dup2(x2ypipe[1],y2zpipe[1]);
dup2(y2zpipe[1],STDOUT_FILENO);
close(y2zpipe[0]);
close(y2zpipe[1]);
int b=execl(argv[i],argv[i],(char *)NULL);
if(b==-1) {
perror("The following error occurred at B");
}
}
}
pid_t zchild =fork();
if(zchild==0) {
dup2(y2zpipe[0],STDIN_FILENO);
close(y2zpipe[0]);
close(y2zpipe[1]);
int c=execl(argv[argc-1],argv[argc-1],(char *)NULL);
if(c==-1) {
perror("The following error occurred at C");
}
}
close(x2ypipe[0]);
close(x2ypipe[1]);
wait(NULL);
wait(NULL);
wait(NULL);
}

现在我只将三个程序传递给 argv[] 并且它工作正常。我必须在 for 循环中添加一条 if 语句来检查 i 的最后/最高可能值,以将 y2z 管道连接到 zchild。我在执行 for 循环中将 children 相互连接起来时遇到了困难。我将如何为最后一个 child 的每个 child 创建一个新管道?

最佳答案

也许这会有所帮助。请注意我如何在 for 循环中调用 pipe(),因此我不必为管道对考虑新的“x2y”、“y2z”、“z2omega”等名称。

另请注意,我如何在 for 循环外部使用变量 prevfd 将前一次迭代的管道文件描述符带入下一次迭代。以及它如何指向“/dev/null”开始。

最后,请注意我如何在循环中根据需要多次调用 wait(),而不是编写 3(或 4、5 或 ... 1,397)次。

#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <cstdlib>
#include <cstdio>
#include <sys/wait.h>

int main(int argc, char *argv[]) {

int prevfd;

prevfd = open("/dev/null", O_RDONLY);

if(prevfd < 0) {
perror("/dev/null");
exit(1);
}

for(int i = 1; i < argc; ++i) {
int pipefd[2];
int kid;

if(i != argc-1 && pipe(pipefd)) {
perror("pipe");
break;
}

if(!fork()) {
dup2(prevfd, 0);
close(prevfd);
if(i != argc-1) {
dup2(pipefd[1], 1);
close(pipefd[0]);
close(pipefd[1]);
}
execl(argv[i], argv[i], (char*)0);
perror(argv[i]);
exit(1);
}

close(prevfd);
prevfd = pipefd[0];
close(pipefd[1]);
}
while(wait((int*)0) != -1)
;
return 0;
}

关于多个子级之间的 C++ 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7973289/

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