| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > Задача по системным вызовам |
| Автор: Flashdown 1.6.2006, 18:36 |
| Рассмотрим очень простую операционную систему, состоящую из главного процесса М, работающего с центральным процессором, читающего процесса R, который работает с читающим каналом, и печатающего процесса Р, который работает с печатающим каналом. Запрограммируйте эти три процесса так, чтобы процесс R читал данные и передавал их процессу М, который обрабатывал бы эти данные и передавал процессу Р для выдачи на печать. Запрограммируйте процессы М, R и Р для случаев, когда имеются (a) два буферных пула, содержащие по К буферов;(b) один буферный пул, содержащий К. буферов. Подскажите, как это сделать! |
| Автор: bsa 1.6.2006, 22:47 |
| Причем здесь юникс? Что за буферные пулы и между какими процессами они находятся? Я, например, эту часть вообще не понял. Это многопоточная программа или как? |
| Автор: GrayCardinal 3.6.2006, 12:12 |
| Flashdown, Можно через сокеты, можно через IPC, можно тупо через файловую систему, да мало ли. $ man 2 ipc |
| Автор: Flashdown 4.6.2006, 22:51 |
| вот надо через IPC |
| Автор: GrayCardinal 5.6.2006, 05:57 | ||
| Flashdown, Через IPC ?Да не вопрос. Код самих процессов -то есть ? R и P ? Это тупая работа, так что увольте Еще пулы будешь сам делать, как один буфер сварганить покажу, дальше по аналогии... Будут проблемы - обращайся. Есть такая фиговина, называется семафоры (mutex). Код (из новой dlib-ы, которую я на днях выложу... наверно. http://sf.net/projects/silenbob)
Вот этим можно решать траблы с блокировкой. Сервак делает sem_init c "ключом" KEY (вообще туда адрес передается на int переменную в которой будет ключ). Клиентура - semget (KEY...) $ man 2 semget Если надо пользовать ID, который дал semget(2) (не sem_init), просто результат в переменную загоняешь (int) и можно все преведенные функции пользовать. Т.е. 1. Клиент делает down_write, пишет данные, делает up_write когда закончит. 2. Сервер делает down_read, читает данные, делает up_read когда закончит. Можно заменить на "простые" down/up, суть не меняется. И все работает без косяков. (в "догонялки" никто не играет). Скорее всего понадобится один для каждого буфера, но это не проблема - там их 9999 свободных если не ошибаюсь, и никто не пользует... В общем код глянь и RTFM. Там основная идея - что все операции (sigactions) - атомарные. Вообще по IPC неплохо справочник иметь под ручками... Вторая проблема - сам буфер(ы) (для процесса M) Тут вообще просто #include <ipc.h> int size = 4096; char * ptr; ptr = (char *) shmget (KEY, size, IPC_CREAT); На серваке (M), без IPC_CREAT на клиентуре ®. Еще на сервере можно настроечки выставить $ man 2 shmctl Ключи выбирай "от фанаря", главное чтоб во всех процессах совпадали. На счет того, чтоб сообщить процессу M что данные типа есть, лично я бы для данного случая тупо включил таймер $ man 2 alarm $ man 2 signal И не парился. Но можно попробовать через $ man 2 msgget Чтоб мессаги кидать. Сам не пользовался, рассказать не могу... Но вроде ничего сложного. |
| Автор: GrayCardinal 5.6.2006, 17:13 |
| Все, отбил желание задачку решать ? |
| Автор: bilbobagginz 6.6.2006, 00:04 |
| мне кажется ему задание неполное дали: для решения требуется знать какие средства есть в этой 'очь просто оперативной системе', под которую у него задание. также обычно в домашках ограничивают: это можно а это низзя. он наверное за второй и третьей страничкой домашки поехал... |
| Автор: GrayCardinal 6.6.2006, 03:36 | ||
bilbobagginz,
Бывает |
| Автор: Flashdown 6.6.2006, 19:53 |
| а помоему условие нормальное... использовать можно семафоры, сигналы, разд. память, и очереди сообщ..... ну вобщем я это уже сделал.. graycardinal , спасибо |
| Автор: regis 24.7.2006, 10:34 |
| Судя по формулировке задачи ("...состоящую из главного процесса М, работающего с центральным процессором..."), ОС вообще имеет микроядерную архитектуру. |