gpt4 book ai didi

C++ dup2 和 execl

转载 作者:太空宇宙 更新时间:2023-11-04 12:15:30 26 4
gpt4 key购买 nike

我正在处理一项任务,我需要创建管道以便其他程序处理不同的功能。我可以毫无问题地通过命令行进行管道传输,这很简单。然而,使用 dup2 和 execl 对我来说很棘手。有一次我能够从我的程序的一部分获得输出,但它没有从另一部分读取任何内容。

这是我所拥有的:

流水线.cpp

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <cstdlib>
#include <iostream>
#include <cctype>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<cstdlib>
#include<unistd.h>
#include<iomanip>
#include <sys/wait.h>

using namespace std;
int main(int argc, char *argv[])
{
int number = atoi(argv[1]);
int x2ypipe[2];

pipe(x2ypipe);
if(x2ypipe==0){
cout<<"ERROR:"<<errno<<endl;
}

pid_t xchild =fork();

if(xchild==0){
dup2(x2ypipe[1],STDOUT_FILENO);
close(x2ypipe[0]);
close(x2ypipe[1]);
execl("./part1.cpp","part1.cpp", (char *)NULL);

}

pid_t ychild =fork();

if(ychild==0){

dup2(x2ypipe[0],STDIN_FILENO);
close(x2ypipe[0]);
close(x2ypipe[1]);
execl("./part2.cpp", "part2.cpp", (char *)NULL);

}

close(x2ypipe[0]);
close(x2ypipe[1]);
wait(NULL);
wait(NULL);

第一部分.cpp

#include<iostream>
#include<cstdlib>
#include<unistd.h>
#include<iomanip>
using namespace std;
int main(int argc, char *argv[])
{

int number = atoi(argv[1]);

for (int k = 1; k <= 9; k++)
{
cout << k << " " << flush;
sleep(1);
}
return 0;
}

第二部分.cpp

#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <iomanip>
using namespace std;
int main()
{

int number;
while (cin >> number)
{
cout << 2 * number - 1 << " " << flush;
}

return 0;
}

好的 pipeline.cpp : fork 两次并在两个 child 之间创建一个管道。然后每个人都使用 excel 将其过程替换为程序 part1 和 part2。所以我的理解是第 1 部分程序会运行,它输出的任何内容都将由运行第 2 部分的第二个 child 获取,并且从那里第 2 部分会正常输出,因为它的输出描述符没有改变。我在这里遗漏或滥用了什么吗?

最佳答案

我注意到一些事情:

  • 执行时,您没有将number 传递给part1 进程
  • 您没有检查 execl() 或任何其他操作系统函数的失败情况

我想一旦你做了这两件事,你就会发现真正的问题是什么。我不会只告诉你答案是什么,因为值得学习如何自己诊断此类问题。 (我能够成功运行您的代码,只需稍作修改。问题不在于您如何处理管道和文件描述符。)

关于C++ dup2 和 execl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7871411/

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