2011-10-24 53 views
1

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

这里是我有:

pipeline.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替换它的过程。所以我的理解是part1程序会运行,它输出的任何东西都会被运行part2的第二个子程序拾取,从那里第二个子程序会正常输出,因为它的输出描述符没有改变。我在这里错过或误用了什么?

+0

在尝试运行它之前,您不需要编译C++源代码吗? –

回答

1

我注意到有两件事情:

  • 你没有通过numberpart1过程,当你exec的是
  • 你不能从execl()或任何其他OS的检查故障功能

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

+0

ahhhh,感谢您的指导。我能够让它正常工作。现在我可以更多地展开它! :) – user975044

0

我认为你需要return 0;exec来电之后。但我比你看起来更迷失方向。