Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Работа с pipe в Linux  (Прочитано 5292 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Satana

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
    • Мой сайт :)
Работа с pipe в Linux
« : 12 Декабря 2009, 17:37:21 »
Помогите написать прогу которыя высчитывает заданную функцию в 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]);
}


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

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


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;
}

явно нужно организовать ожидание завершения дочернего процесса. Но как это сделать пока я не понял.
Помогите плз !
« Последнее редактирование: 13 Декабря 2009, 07:35:52 от Satana »

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Работа с pipe в Linux
« Ответ #1 : 14 Декабря 2009, 08:22:52 »
Посмотрите на функцию wait.
« Последнее редактирование: 14 Декабря 2009, 08:48:07 от alexander.pronin »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: Работа с pipe в Linux
« Ответ #2 : 14 Декабря 2009, 14:10:49 »
wait или waitpid

Тут все подробно разжевано
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн Satana

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
    • Просмотр профиля
    • Мой сайт :)
Re: Работа с pipe в Linux
« Ответ #3 : 17 Декабря 2009, 20:35:44 »
C wait разабрался!
Теперь не получеатся нормально получить данные из трубы!
рид написан правтльно...грешу на dup2 т.к если писать сразу трубу буз дублирования то все хорошо считывается, а так получаю КРАКОЗЯБРЫ.
Помогите плз! или дайте ссылочку на пример с использованием   execl, dup2,pipe() и считыванием из трубы соответственно.

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Работа с pipe в Linux
« Ответ #4 : 18 Декабря 2009, 08:44:06 »
См. книгу Н.Иванова "Программирование в Linux". Там все есть, что нужно.

 

Страница сгенерирована за 0.016 секунд. Запросов: 22.