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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сортировка строки, используя fork() и pipe, сортировка строки, используя fork() и p 
:(
    Опции темы
awake
Дата 14.5.2012, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дали задание используя системный вызов fork() и pipe. Решить какую-то задачу.
Я решил сделать "сортировку пузырьком".
Вот код
Код

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void bubble(char *items, int count);

int main(void)
{
  char s[255];

  printf("Input string:");
  gets(s);
  bubble(s, strlen(s));
  printf("Sorted string: %s.\n", s);

  return 0;
}
/* Пузырьковая сортировка. */
void bubble(char *items, int count)
{
  int a, b;
  char t;

  for(a=1; a < count; ++a)
    for(b=count-1; b >= a; --b) {
      if(items[b-1] > items[b]) {
        /* exchange elements */
        t = items[b-1];
        items[b-1] = items[b];
        items[b] = t;
      }
    }
}



А как теперь этот код передалать используя fork() и pipe. 

Если я правильно понял задание то нужно создать процесс(потомок) , используя fork(), затем отсортировать сроку и записать её в канал(write), а затем сам результат прочитать в Родителе(read).

Я вот немного не пойму в где производить саму сортировку. в Потомке или в Родителе? и как правильно всё туда записать?
PM MAIL   Вверх
xvr
Дата 14.5.2012, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(awake @  14.5.2012,  10:52 Найти цитируемый пост)
Я решил сделать "сортировку пузырьком".

Не самый удачный выбор. Нужно делать то, что можно легко распараллелить. Пузырек не параллелится. Лучше возьмите QuickSort, если уж хочется что то посортировать

PM MAIL   Вверх
sergioK1
Дата 14.5.2012, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(awake @ 14.5.2012,  09:52)
А как теперь этот код передалать используя fork() и pipe. 

ну как то так 

Код

 int status;
 char s[255];
  char    readbuffer[255];
 int     fd[2], nbytes;
  printf("Input string:");
  gets(s);

  printf("Sorted string: %s.\n", s);
 pipe(fd);
int pid=fork();
if(pid<0)
{
/*error code*/
}
else if(pid==0)
{
     bubble(s, strlen(s));
        close(fd[0]);
      write(fd[1], s, (strlen(s)+1));
     exit(0);

}
else{
waitpid(pid,&status,0);
   int nbytes = read(fd[0], readbuffer, sizeof(readbuffer));
     printf("Received string: %s", readbuffer);
    close (fd[1]);
/* parent work */
}


 хотя  на компе не проверял ,  лины нет под рукой 
 
xvr
Не понял ваш пост 
 Какая разница какой алгоритм потомок юзает ?, главное что результат был в трубе,  и папа его вытащит 
 

Это сообщение отредактировал(а) sergioK1 - 14.5.2012, 21:02
PM MAIL   Вверх
xvr
Дата 15.5.2012, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(sergioK1 @  14.5.2012,  20:58 Найти цитируемый пост)
Не понял ваш пост 

У меня есть подозрение, что от ТС хотели параллельной сортировки (ну или чего то параллельного), а не 'общения через трубу'. Т.к. первое еще имеет какой то смысл, а второе никакого смысла не имеет  smile 

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


Новичок



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

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



Цитата(xvr @ 15.5.2012,  10:27)
Цитата(sergioK1 @  14.5.2012,  20:58 Найти цитируемый пост)
Не понял ваш пост

У меня есть подозрение, что от ТС хотели параллельной сортировки (ну или чего то параллельного), а не 'общения через трубу'. Т.к. первое еще имеет какой то смысл, а второе никакого смысла не имеет  smile


Да вы правы мне действительно нужна параллельная сортировка.И "пузырёк" не подходит. По вашему совету думаю взять "быструю сортировку".

Как я понял часть сортировки нужно реализовать в потомке, а затем через трубу отправить результат для дальнейшей сортировки в родителе. 
Или сортировку реализовать в 2 потомках а затем результаты их сортировки отправить через трубу родителю.

А как правильно это сделать? Не могли бы вы привести пример.

PM MAIL   Вверх
sergioK1
Дата 15.5.2012, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(awake @ 15.5.2012,  11:16)
Или сортировку реализовать в 2 потомках а затем результаты их сортировки отправить через трубу родителю.


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

PM MAIL   Вверх
xvr
Дата 15.5.2012, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(awake @  15.5.2012,  12:16 Найти цитируемый пост)
Как я понял часть сортировки нужно реализовать в потомке, а затем через трубу отправить результат для дальнейшей сортировки в родителе. 
Или сортировку реализовать в 2 потомках а затем результаты их сортировки отправить через трубу родителю.

Быстрая сортировка вещь рекурсивная и в принципе паралельная. Сначала пробегаете массив и ищите середину (с обменом байтов). Потом делаете fork, и в новом процессе запускаете себя рекурсивно на 1ю часть массива, а в родителе продолжаете со 2й частью. По окончанию новый процесс отправляет родителю свою отсортированную часть через pipe, а родитель ждет ее, присоединяет 2ю часть массива и завершается (или отправляет через pipe то, что получилось своему родителю)

PS. pipe можно использовать для всех процессов один

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

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

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


 




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


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

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