LINUX.ORG.RU

Передача данных через семафоры

 


0

2

Доброго времени суток. Суть проблемы - пишу курсовой на с. Необходимо сделать передачу данных(массив) используя семафоры. Сперва я сделал передачу через pipe, используя семафоры для поочередного доступа к ресурсу. Но преподаватель указал на текст задания, а там написано:

никаких дополнительных средств коммуникации между процессами не использовать, только семафоры.

т.е. FIFO, разделяемую память и т.п. использовать нельзя. Может кто подскажет, как это реализовать?

Заранее огромное спасибо



Последнее исправление: gwyllum (всего исправлений: 1)

Забавно. Опубликуй точную формулировку задачи, данную преподом.

Я могу тебе посоветовать способ, но он больше подходит для анекдота, чем для курсовой работы %)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Там дерево процессов. Но текст задания таков:

Зелѐный получает со стандартного потока информацию о файлах каталога, и, во-первых, выводит на экран строки о тех из них, у которых установлен бит запуска владельцем; во- вторых, при помощи семафоров передаѐт оранжевому размер каждого из таких файлов (никаких дополнительных средств коммуникации между зелѐным и оранжевым не использовать, только семафоры), а оранжевый суммирует и выводит каждый раз полученное значение и текущую сумму на экран; в-третьих, зелѐный через pipe передаѐт жѐлтому имена этих файлов, а жѐлтый записывает их в файл и передаѐт красному, используя разделяемую память. Тот полученную информацию отображает на экране и сохраняет в файле.

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

Передай своему преподу, что он либо не умеет формулировать задачи, либо совсем поехавший.

Ну и, поскольку каждый семафор - это счетчик, можно делать так: создаешь несколько десятков семафоров, и кодируешь каждым из них 1 бит (например, захваченный семафор - 1, незахваченный - 0); вся совокупность семафоров кодирует двоичное число (размер файла). Дальше делаешь так же, как и раньше, просто твой «разделяемый ресурс» состоит из одних только семафоров.

Наверное, в SysV-семафорах можно исхитриться и передать число через сам семафор, но мне лень читать маны :)

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 2)
Ответ на: комментарий от tailgunner

Спасибо за ответ. Я тоже слабо представляю что препод хочет. Единственный вариант, который приходит в голову, это в первом процессе присваивать какой-то переменной значение одного из размеров файла, а во втором - считывать это число, выводить на печать и обнулять. Если в первом число обнулилось, то он присваивает следующее. Но если честно, не уверен насколько это правильно и насколько это вообще можно реализовать.

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

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

Без разделяемой памяти это невозможно.

tailgunner ★★★★★
()
Ответ на: комментарий от nanoolinux

sem_getvalue что-ли?

Не хватит для больших файлов. Хотя... можно построить на этом протокол с эскейпингом %)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

вся совокупность семафоров кодирует двоичное число (размер файла).

И еще один семафор на признак готовности данных.

Pavval ★★★★★
()

Препод — superhackkiller1997?

buddhist ★★★★★
()
Ответ на: комментарий от Pavval

вся совокупность семафоров кодирует двоичное число (размер файла).

Каждый семафор в наборе - это байт данных. Массив передавать используя semctl с GETALL, два других семафора использовать для синхронизации приёмника и передатчика. Задача нормальная и интересная, а те, кто на препода пеняет - это обычное тупое ЛОРовское быдло.

anonymous
()
Ответ на: комментарий от anonymous

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

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

Для зочника - саоме то, по-моему. Принудит поковыряться в предмете хоть немного. Думаю, что задача намеренно сформулирована именно так, чтобы не решалась совсем уж в лоб.

anonymous
()

Ты потом не забудь рассказать нам, что препод имел ввиду.

generator ★★★
()

Эээх, школота. Бери 10 семафоров. 8 для кодирования числа. И по одному для «можно читать» и «можно кодировать». Хотя для управляющего «канала» вроде достаточно одного семафора. Для «канала» данных можно хоть один семафор использовать, только чуть больше движений придётся совершить для сборки в байты

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.