C ++ dup2 и execl - PullRequest
       39

C ++ dup2 и execl

1 голос
/ 24 октября 2011

Я работаю над заданием, и мне нужно создать каналы, чтобы другие программы выполняли разные функции. У меня нет проблем с командной строкой, это легко. Однако использование 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;
}

Хорошо, так pipe.cpp: дважды разветвляется и создает канал между двумя дочерними элементами. Затем каждый использует Excel, чтобы заменить свой процесс программами part1 и part2. Таким образом, я понимаю, что программа part1 будет работать, и все, что она выводит, будет получено вторым дочерним элементом, который выполняет part2, и оттуда вторая часть будет выводить нормально, поскольку ее дескриптор вывода не был изменен. Я что-то здесь пропускаю или неправильно использую?

Ответы [ 2 ]

1 голос
/ 24 октября 2011

Я заметил пару вещей:

  • Вы не передаете number процессу part1, когда выполняете его
  • Вы не проверяетесбой execl() или любой другой функции ОС

Я думаю, что когда вы сделаете эти две вещи, вы поймете, в чем проблема real .Я не просто скажу вам, каков ответ, потому что стоит научиться самостоятельно диагностировать такие проблемы.(Я смог успешно запустить ваш код с небольшими изменениями. Проблема не в том, как вы обрабатываете каналы и файловые дескрипторы.)

0 голосов
/ 15 февраля 2012

Я думаю, вам нужно return 0; после ваших exec звонков.Но я даже более потерян, чем ты, кажется.

...