Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про параллельные процессы. 
V
    Опции темы
abskura
  Дата 15.12.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 21.11.2009

Репутация: 1
Всего: 1



Есть такое вот задание:
Написать программу, создающую и заполняющую текстовый файл. Информацию этого текстового файла через межпроцессный канал передать в параллельный процесс. В нем после каждого символа текста вписать в файл порядковый номер и передать через межпроцессный канал в параллельный процесс, где разделить каждый символ со своим номером пробелом. Из текущего процесса переслать полученную информацию в исходный процесс и там вывести на печать. Предусмотреть возможность прерывания от клавиатуры.
 
Мне не понятно как реализовать вот это действие: " Из текущего процесса переслать полученную информацию в исходный процесс и там вывести на печать."
 
Разве исходный процесс не будет уже выполнен? И если нет, то как к нему обратится. Читая про fork() и pipe() я ни где не встречал примеров с такими вот кульбитами, туда-сюда, между процессами. Может, у кого ссылка есть какая-нибудь, где подобное взаимодействие рассматривается? Я пока ни чего не нашёл, везде стандартный пример: создаём канал, создаём новый процесс форком, в процессе сыне что-то пишем в канал, в процессе отце читаем, и все.
PM MAIL   Вверх
GrayCardinal
Дата 15.12.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 8
Всего: 58



20$


--------------------
PM MAIL WWW   Вверх
abskura
Дата 15.12.2009, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 21.11.2009

Репутация: 1
Всего: 1



GrayCardinal, да давайте полтинник сразу, чего мелочиться-то)
У вас по теме ответ есть?
PM MAIL   Вверх
svlary
Дата 16.12.2009, 06:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата(abskura @  15.12.2009,  16:35 Найти цитируемый пост)
У вас по теме ответ есть?

man 2 pipe
PM MAIL   Вверх
MAKCim
Дата 16.12.2009, 09:51 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Код

int pfd1cp[2];
int pfd1pc[2];
pid_t pid1;

pipe(pfd1cp);
pipe(pfd1pc);
pid1 = fork();
...
/* процесс  родитель pid1 */
    close(pfd1cp[1]);
    close(pfd1pc[0]);
    ...
    write(pfd1pc[1], data, size); /* передаем данные первому параллельному процессу */
    ...
    read(pfd1cp[0], data, size); /* читаем результат */
...
/* процесс потомок pid1 */
    int pfd2pc[2];
    pid_t pid2;

    close(pfd1cp[0]);
    close(pfd1pc[1]);
    pipe(pfd2pc);
    pid2 = fork();
    ....
    /* процесс родитель pid2 */
        close(pfd2pc[0]);
        close(pfd1cp[1]);
        ...
        read(pfd1pc[0], data, size); /* получаем данные от исходного процесса */
        /* преобразуем их */
        write(pfd2pc[1], data, size); /* передаем данные второму параллельному процессу */
        ...
    /* процесс потомок pid2 */
        close(pfd2pc[1]);
        ...
        read(pfd2pc[0], data, size); /* получаем данные от первого параллельного процесса */
        /* преобразуем их */
        write(pfd1cp[1], data, size); /* передаем в исходный процесс */



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Void
Дата 16.12.2009, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 3
Всего: 173



Цитата(abskura @  15.12.2009,  16:28 Найти цитируемый пост)
Читая про fork() и pipe() я ни где не встречал примеров с такими вот кульбитами, туда-сюда, между процессами.

Такие вещи обычно не рассматривают, потому что двухсторонняя передача через каналы чревата ошибками, очень легко получить deadlock на блокирующихся операциях.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
abskura
Дата 16.12.2009, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 21.11.2009

Репутация: 1
Всего: 1



svlary:
Цитата(svlary)
man 2 pipe

То, что два пайпа, это понятно, но всё равно спасибо).
Мне было не понятно поведение процессов, но теперь разобрался).

MAKCim: 
вот это ответище). Спасибо, за такую подробную схему)

Void:
Цитата(Void)
Такие вещи обычно не рассматривают, потому что двухсторонняя передача через каналы чревата ошибками, очень легко получить deadlock на блокирующихся операциях.

Спасибо, будем знать.
PM MAIL   Вверх
xvr
Дата 17.12.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(abskura @ 16.12.2009,  22:51)
svlary:
Цитата(svlary)
man 2 pipe

То, что два пайпа, это понятно, но всё равно спасибо).

 smile '2 pipeа' - это пять!
man 2 pipe - это не '2 pipeа', а 'смотри pipe в секции 2' (секция 2 - системные вызовы)

PM MAIL   Вверх
abskura
Дата 17.12.2009, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 21.11.2009

Репутация: 1
Всего: 1



Чёрд...

Но ведь в итоге действительно понадобятся два пайпа)). Так что будем считать, что мы друг друга поняли)
PM MAIL   Вверх
abskura
Дата 18.12.2009, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 21.11.2009

Репутация: 1
Всего: 1



Уважаемые, а может кто ещё подскажет как осуществить данное действие? 

В нем после каждого символа текста вписать в файл порядковый номер и передать через межпроцессный канал в параллельный процесс, где разделить каждый символ со своим номером пробелом. 

Если прогонять массив со строкой в цикле, то после 9-го элемента начнутсся проблемы, так как пойдут числа состоящие из 2-ух цифр, а если строка достаточно длинная то потом и из 3-ёх.

Листал справочник команд, не нашёл там ни чего такого для редактирования строк... 

Это сообщение отредактировал(а) abskura - 18.12.2009, 23:46
PM MAIL   Вверх
xvr
Дата 19.12.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Ну sprintf например

PM MAIL   Вверх
abskura
Дата 19.12.2009, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 21.11.2009

Репутация: 1
Всего: 1



Цитата(xvr @ 19.12.2009,  11:56)
Ну sprintf например

Не вполне понимаю как...

На всякий случай уточню задание на примере.

Есть файл с таким вот текстом, например:
abcdefghijklm

Нужно сначала его сделать таким:
a1b2c3d4e5f6g7h8i9j10k11l12m13

А затем, таким:
a 1b 2c 3d 4e 5f 6g 7h 8i 9j 10k 11l 12m 13

И каким образом тут поможет функция sprintf? Она же просто направляет данные в символьную строку. Или я чего-то не знаю о sprintf?


UPD: Отбой, разобрался причём тут  sprintf)). Всем спасибо, проблема решина.

Это сообщение отредактировал(а) abskura - 20.12.2009, 00:05
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1081 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.