Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2013, 20:54   #1
Egyptorium
Пользователь
 
Регистрация: 14.12.2011
Сообщений: 17
По умолчанию пытаюсь разобраться с pipe, (linux,c++)

Добрый день, передо мной стоит задача разобраться с межпроцессным взаимодействием с помощью пайпов. Один процесс считывает файл и передает его в pipe. Второй процес получает данные из пайпа и пишет их в файл. в результате должно получиться 2 одинаковых файла.
Я нашел 2 способа и ни один из них не могу довести до конца.
1 - использовать string (загоняем весь файл в одну переменную и помещаем ее в pipe) Проблема в том, что если в пайп получается засунуть string, то при получении строки из пайпа вылазит жуткая ошибка библиотеки glibc.
2 - использовать массив char несколько раз посимвольно или болками например по 1024 символа. Проблема в том, что у меня не получается считать 1024 символа целиком, с пробелами и пр. могу или слово, или линию или все. Еще не понятно что делать с символом конца файла. И самое главное: Как получающий поток узнает, о завершении передачи.
Помогите пожалуйста довести до ума хотя бы 1 из способов или пожскажите, что почитать, чтобы это сделать. Зараннее спасибо.
Прилагаю код варианта со string, который компилирутся, но выпадает в ошибку.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <time.h>
#include <string>
#include <iostream>
#include <sstream>
#include <fstream>
using namespace std;

#define SIZE 1024


main( )
{
int fd[2], nread,nread2, pid;
char buf;
char buf2[SIZE];
if(pipe(fd) == -1)
{perror("pipe failed"); exit(1);}
if((pid = fork()) < 0)
{perror("fork failed"); exit(2);}
if(pid == 0)
{ /* процесс потомок */
close(fd[1]);
ofstream ofile ("output.txt");
string contents;
cout <<"что-то ворочается";
void * p = & contents;
int size;
void * ps = & size;
read (fd[0],ps,sizeof(int));
cout << size;
read(fd[0],p,size+1);
cout <<"!!!"<<contents<<"!!!";
ofile<<contents;
cout << "Салют!!!";
close(fd[0]); }

else
{ /* процесс родитель */
close(fd[0]);
ifstream ifile ("input.txt");
stringstream stream;
stream<<ifile.rdbuf();
string contents(stream.str());
const void * p = & contents;
cout << contents;
int size = sizeof (contents);
const void * ps = & size;
cout <<size<<"!";
write (fd[1],ps,sizeof(size));
write (fd[1],p,size+1);
close(fd[1]);}
}
Egyptorium вне форума Ответить с цитированием
Старый 09.01.2013, 13:04   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Код:
#define SIZE 1024

int main( )
{
    int fd[2], /*nread,nread2,*/ pid;
    char buf2[SIZE];
    if(pipe(fd) == -1)
        {perror("pipe failed"); exit(1);}
    if((pid = fork()) < 0)
        {perror("fork failed"); exit(2);}
    if(pid == 0)
    { /* процесс потомок */
        close(fd[1]);
        ofstream ofile ("output.txt");
        cout <<"что-то ворочается";
        int len;
        while ((len = read(fd[0], buf2, SIZE)) != 0)
        ofile.write(buf2, len);
    }

    else
    { /* процесс родитель */
        close(fd[0]);
        ifstream ifile ("input.txt");
        stringstream stream;
        stream<<ifile.rdbuf();
        string contents(stream.str());
        const char * mystr = contents.c_str();
        write(fd[1], (void *) mystr, strlen(mystr) + 0);
        close(fd[1]);
    }
}

Последний раз редактировалось eoln; 09.01.2013 в 13:08.
eoln вне форума Ответить с цитированием
Старый 09.01.2013, 17:04   #3
Egyptorium
Пользователь
 
Регистрация: 14.12.2011
Сообщений: 17
По умолчанию

Большое спасибо!
Кстати, можете сразу подсказать в чем отличие между чтением *.txt и *.jpg
Когда пытаюсь считывать вместо текстового файла графический - выходит какая-то лажа. Если не сложно можно узнать почему?
Egyptorium вне форума Ответить с цитированием
Старый 09.01.2013, 22:51   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

jpg - бинарный файл, Считать в строку не получится
Код:
{ /* процесс родитель */
        close(fd[0]);
        ifstream ifile ("input.jpg", ios_base::binary);
        ifile.seekg (0, ios::end);
        int len = ifile.tellg();
        ifile.seekg (0, ios::beg);
        char * buf3 = new char [len];
        ifile.read(buf3, len);
        write(fd[1], (void *) buf3, len);
        close(fd[1]);
        ifile.close();
    }
Если файл очень большой, то лучше передавать блоками, а ещё лучше большие файлы так не передавать.
eoln вне форума Ответить с цитированием
Старый 10.01.2013, 02:12   #5
Egyptorium
Пользователь
 
Регистрация: 14.12.2011
Сообщений: 17
По умолчанию

Огромное вам спасибо!
Тема закрыта.
Egyptorium вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пытаюсь разобраться с API сайта (php+xml+soap) woulf PHP 0 17.12.2012 03:05
пытаюсь разобраться Кудаив Помощь студентам 6 01.05.2012 23:04
Определить размер Pipe IceBreaker Помощь студентам 4 04.02.2010 18:28
Пытаюсь разобраться в принципах куки! Steh JavaScript, Ajax 2 02.02.2010 13:03
Пытаюсь разобраться в задании fs444 Microsoft Office Excel 12 12.01.2010 12:57