我正在进行一项任务,我需要创建管道,以便其他程序处理不同的功能。我能够通过命令行管道没问题,这很容易。但是使用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:forks两次并在两个孩子之间创建一个管道。然后每个使用excel用程序part1和part2替换它的进程。所以我的理解是part1程序将运行,它输出的任何东西都将由运行part2的第二个子进程拾取,并且从那里第二部分将正常输出,因为它的输出描述符没有被改变。我在这里丢失或误用了什么吗?
答案 0 :(得分:1)
我注意到了几件事:
number
传递给part1
进程execl()
或任何其他操作系统功能的失败我认为一旦你做了这两件事,你就会发现真正的问题是什么。我不会只是告诉你答案是什么,因为学习如何自己诊断这些问题是值得的。 (我只需稍作修改即可成功运行您的代码。问题不在于您如何处理管道和文件描述符。)
答案 1 :(得分:0)
我认为在return 0;
来电之后,您需要exec
。但是我看起来比你更失落。