C++ dup2 和 execl

Posted

技术标签:

【中文标题】C++ dup2 和 execl【英文标题】:C++ dup2 and execl 【发布时间】:2011-10-24 04:48:42 【问题描述】:

我正在处理一项任务,我需要创建管道以便其他程序处理不同的功能。我能够通过命令行进行管道传输没问题,这很容易。然而,使用 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);

part1.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;

part2.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 :分叉两次并在两个孩子之间创建一个管道。然后每个人都使用 excel 将其进程替换为程序 part1 和 part2。所以我的理解是第 1 部分程序将运行,并且它输出的任何内容都将由运行第 2 部分的第二个孩子拾取,并且从那里第 2 部分将正常输出,因为它的输出描述符没有更改。我在这里遗漏或误用了什么吗?

【问题讨论】:

在尝试运行之前不必编译 C++ 源代码吗? 【参考方案1】:

我注意到了几件事:

在执行 number 时,您没有将其传递给 part1 进程 您没有从 execl() 或任何其他操作系统功能检查故障

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

【讨论】:

啊啊啊,谢谢你的指导。我能够让它正常工作。现在我可以进一步扩展它! :)【参考方案2】:

我认为您需要在您的exec 呼叫之后return 0;。但我比你看起来更迷茫。

【讨论】:

以上是关于C++ dup2 和 execl的主要内容,如果未能解决你的问题,请参考以下文章

dup/dup2

dup和dup2函数

文件IO详解(十四)---dup函数和dup2函数详解

如何在 C++ 中正确打开和关闭文件?

dup和dup2函数

dup函数和dup2函数