#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;
}
Работа с pipe()
Код:
Дочерние процессы в трубу вродебы пишут, но вот при попытке что-то считать из нее все сразу виснит.
У меня такие мысли, что надо сделать чтобы главный процесс ждал завершения всех дочерних процессов, а уже потом продолжал работу.
Помогите пожалуйста разобраться! Заранее спасибо!
Ну, так понятно. У Вас дочерние процессы-то не завершаются :). При успешном выполнени execl у Вас управление в процесс никогда не вернётся. Родительский процесс будет висеть на wait(0) в бессмысленном ожидании завершения дочернего. Также функция close() никогда не будет выполнена.
muturgan если не трудно напиши код для примера как можно сделать!
Я тут уже долго с этой задачей бьюсь, а толку никакого и нормальных примеров нигде найти не могу.
Код:
#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;
}
#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 :) Но, думаю, на основе этого кода, Вы сможете написать свой.
спасибо! Буду пробовать!
Теперь в пайп пишется. Но появилась след проблемка. Не получается получить номальные даные из него! Программы fakt и pow считают факториал и степень.
Цитата: S@tana
Не получается получить номальные даные из него!
Тогда попробуйте читать из канала в цикле, пока read() возвращает >0.
Хотел узнать правильно ли рид написан и можно ли еще как нибудь считать файлы из трубы?
Если писать данные сразу в пайп через writ то потом все хорошо читает, а если сделать dup2 потом execl и считать то выдает кракозябры!
Помогите получеть нормальные данные! Очень надо!
Цитата: S@tana
Нашол почему выдает кракозябры... Они появляются из-за использования dup2.
Ну, я бы так не стал утверждать. Вообще говоря, очень странно, если это действительно так. А Вы пробовали сделать что-либо подобное?
Код:
dup2(fd[1],1);
cout << "message for pipe";
cout << "message for pipe";
Цитата:
Цитата:Сообщение от S@tana
Нашол почему выдает кракозябры... Они появляются из-за использования dup2.
Ну, я бы так не стал утверждать. Вообще говоря, очень странно, если это действительно так. А Вы пробовали сделать что-либо подобное?
Код:
dup2(fd[1],1);
cout << "message for pipe";
Нашол почему выдает кракозябры... Они появляются из-за использования dup2.
Ну, я бы так не стал утверждать. Вообще говоря, очень странно, если это действительно так. А Вы пробовали сделать что-либо подобное?
Код:
dup2(fd[1],1);
cout << "message for pipe";
Сделал как вы посоветовали. Вот что получил
Цитата:
Messege for pipe()x▒t4▒▒▒\
Это значит, что у меня в программе екзекнутая программа не работает? Потому что у меня выдает такиеже кракозябры как те что после Messege for pipe().
Код:
dup2(fd[1],1);
cout << "message for pipe\0";
cout << "message for pipe\0";
Скорее всего, Вам в Ваших программах, которым передаётся управление, достаточно плюнуть в stdout символ '\0'. (после печати всех данных, разумеется). И это отнюдь не проблема с кодировкой, просто строка у Вас не обрезается.
Он саказал что вроде то что написано по идеи должно работать, но видимо я гдето очь сильно косячу!
Так же нашли причину кракозябр! Это мусор из массива buf, и еще увидели что екзекнутая программа не пишет в трубу.
Препод дал мне пример программы которая использует dup, execv и pipe().
В общем буду мудить дальше!
muturgan спасибо большое за помощь!