首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ dup2和execl

C++ dup2和execl
EN

Stack Overflow用户
提问于 2011-10-24 12:48:43
回答 2查看 985关注 0票数 1

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

这就是我所拥有的:

pipeline.cpp

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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替换它的进程。所以我的理解是,part1程序会运行,它输出的任何东西都会被运行part2的第二个子程序提取,然后第二部分会正常输出,因为它的输出描述符没有改变。我是不是遗漏或误用了什么?

EN

回答 2

Stack Overflow用户

发布于 2011-10-24 13:19:02

我注意到几件事:

  • 您没有将number传递给part1进程当您执行它时
  • 您没有检查来自execl()或任何其他操作系统函数的故障

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

票数 1
EN

Stack Overflow用户

发布于 2012-02-15 09:14:56

我认为你需要在你的exec调用之后使用return 0;。但我似乎比你更迷茫。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7871411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档