我正在分配作业,我需要创建管道,以便其他程序处理不同的功能。我能够通过命令行无问题,那很容易。但是,使用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: fork 两次并在两个子节点之间创建一个管道。然后,每个使用excel的人都用程序part1和part2替换其过程。所以我的理解是,part1程序将运行,并且输出的任何内容都将由运行part2的第二个子进程拾取,由于没有更改其输出描述符,因此从那里第二部分将正常输出。我在这里想念或滥用吗?

最佳答案

我注意到了几件事:

  • 执行
  • 时,您没有将number传递给part1进程
  • 您不会通过execl()或任何其他OS函数
  • 检查失败

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

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

    10-11 16:36