Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с pipe()

2.2K
11 декабря 2009 года
S@tana
53 / / 15.10.2009
Нужно написать прогу которыя высчитывает заданную функцию в 3 форках с использованием пайпов.

Код:
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

using namespace std;

int main(int argv, char *argc[])
{
int n,k;
int faktN,faktK,pow;
int fd1[2],fd2[2],fd3[2];

int  pr1,pr2,pr3;

pr1=fork();
if(pr1==0)
{
    pipe(fd1);
    dup2(fd1[1],1);
    execl("fakt",argc[1]);
    close(fd1[1]);
} else
wait(0);


pr2=fork();
if (pr2==0)
{
    pipe(fd2);
    dup2(fd2[1],1);
    execl("fakt",argc[2]);
    close(fd2[1]);
}else
wait(0);

pr3=fork();
if (pr3==0)
{
    pipe (fd3);
    dup2(fd3[1],1);
    execl("pow",argc[1],argc[1],argc[2]);
    close(fd3[1]);
}else
wait(0);

char buf1[50];
char buf2[50];
char buf3[50];

read(fd1[0],buf1,sizeof(buf1));
read(fd2[0],buf2,sizeof(buf2));
read(fd3[0],buf3,sizeof(buf3));

cout<<buf1<<" "<<buf2<<" "<<buf3<<endl;
/*
int rez;

faktN=atoi(buf1[1]);
faktK=atoi(buf2[1]);
pow=atoi(buf3[1]);

rez=(faktN-faktK)/pow;

cout<<rez<<endl;
*/

return 0;
}


Дочерние процессы в трубу вродебы пишут, но вот при попытке что-то считать из нее все сразу виснит.
У меня такие мысли, что надо сделать чтобы главный процесс ждал завершения всех дочерних процессов, а уже потом продолжал работу.

Помогите пожалуйста разобраться! Заранее спасибо!
34K
11 декабря 2009 года
muturgan
96 / / 01.10.2009
Ну, так понятно. У Вас дочерние процессы-то не завершаются :). При успешном выполнени execl у Вас управление в процесс никогда не вернётся. Родительский процесс будет висеть на wait(0) в бессмысленном ожидании завершения дочернего. Также функция close() никогда не будет выполнена.
2.2K
11 декабря 2009 года
S@tana
53 / / 15.10.2009
А чего тогда сделать?
muturgan если не трудно напиши код для примера как можно сделать!
Я тут уже долго с этой задачей бьюсь, а толку никакого и нормальных примеров нигде найти не могу.
34K
13 декабря 2009 года
muturgan
96 / / 01.10.2009
Код:
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

using namespace std;

int main(int argv, char *argc[])
{
    int n,k;
    int faktN,faktK,pow;
    int fd1[2],fd2[2],fd3[2];

    int  pr1,pr2,pr3;
    [color="red"]pipe(fd1); //pipe() должен быть вызван до вызова fork(),
               //иначе канал будет существовать только внутри процесса [/color]


    pr1=fork();
    if(pr1==0)
    {
        close(fd1[0]);
        dup2(fd1[1],1);
        execl("fakt",argc[1]);
    }
    else close(fd1[1]);
/*
     Случаи 2 и 3 аналогично.
*/

    char buf1[50];
    read( fd1[0],buf1,sizeof(buf1) );
    cout << buf1 << endl;
    return 0;
}

Прогу не тестировал, потому как я не знаю что такое fact :) Но, думаю, на основе этого кода, Вы сможете написать свой.
2.2K
15 декабря 2009 года
S@tana
53 / / 15.10.2009
спасибо! Буду пробовать!
2.2K
15 декабря 2009 года
S@tana
53 / / 15.10.2009
Теперь в пайп пишется. Но появилась след проблемка. Не получается получить номальные даные из него! Программы fakt и pow считают факториал и степень.
34K
15 декабря 2009 года
muturgan
96 / / 01.10.2009
Цитата: S@tana
Не получается получить номальные даные из него!


Тогда попробуйте читать из канала в цикле, пока read() возвращает >0.

2.2K
15 декабря 2009 года
S@tana
53 / / 15.10.2009
Я немного не так выразился. Прога выдает кракозябры!(на подобии если текст в другой кодировке посмотреть)
Хотел узнать правильно ли рид написан и можно ли еще как нибудь считать файлы из трубы?
2.2K
17 декабря 2009 года
S@tana
53 / / 15.10.2009
Нашол почему выдает кракозябры... Они появляются из-за использования dup2.
Если писать данные сразу в пайп через writ то потом все хорошо читает, а если сделать dup2 потом execl и считать то выдает кракозябры!
Помогите получеть нормальные данные! Очень надо!
34K
18 декабря 2009 года
muturgan
96 / / 01.10.2009
Цитата: S@tana
Нашол почему выдает кракозябры... Они появляются из-за использования dup2.


Ну, я бы так не стал утверждать. Вообще говоря, очень странно, если это действительно так. А Вы пробовали сделать что-либо подобное?

 
Код:
dup2(fd[1],1);
cout << "message for pipe";
2.2K
18 декабря 2009 года
S@tana
53 / / 15.10.2009
Цитата:
Цитата:Сообщение от S@tana
Нашол почему выдает кракозябры... Они появляются из-за использования dup2.


Ну, я бы так не стал утверждать. Вообще говоря, очень странно, если это действительно так. А Вы пробовали сделать что-либо подобное?

Код:
dup2(fd[1],1);
cout << "message for pipe";



Сделал как вы посоветовали. Вот что получил

Цитата:
Messege for pipe()x&#9618;t4&#9618;&#9618;&#9618;\



Это значит, что у меня в программе екзекнутая программа не работает? Потому что у меня выдает такиеже кракозябры как те что после Messege for pipe().

34K
18 декабря 2009 года
muturgan
96 / / 01.10.2009
А если вот так: :)
 
Код:
dup2(fd[1],1);
cout << "message for pipe\0";

Скорее всего, Вам в Ваших программах, которым передаётся управление, достаточно плюнуть в stdout символ '\0'. (после печати всех данных, разумеется). И это отнюдь не проблема с кодировкой, просто строка у Вас не обрезается.
2.2K
18 декабря 2009 года
S@tana
53 / / 15.10.2009
Сегодня у препода спрашивал че за шляпа творится с прогой :)
Он саказал что вроде то что написано по идеи должно работать, но видимо я гдето очь сильно косячу!
Так же нашли причину кракозябр! Это мусор из массива buf, и еще увидели что екзекнутая программа не пишет в трубу.
Препод дал мне пример программы которая использует dup, execv и pipe().
В общем буду мудить дальше!
2.2K
28 декабря 2009 года
S@tana
53 / / 15.10.2009
Все после долгих мучении программа написана и работает!
muturgan спасибо большое за помощь!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог