В памяти размещается новая структура msr и добавляется в начало очереди ожидания.
В поле r_tsk в msr заносится указатель на текущий процесс.
В поле r_msgtype и r_mode
заносятся ожидаемый тип сообщения и режим поиска соответственно.
Если установлен флаг MSG_NOERROR, то в поле r_maxsize заносится значение из msgsz, в противном случае - значение INT_MAX.
В поле r_msg заносится признак того, что сообщение не найдено.
После завершения инициализации, процесс приобретает статус TASK_INTERRUPTIBLE, глобальная блокировка очереди сообщений снимается и вызывается планировщик schedule().
После активизации ожидающего процесса сразу же проверяется поле r_msg. Это поле содержит либо сообщение переданное напрямую, либо код ошибки. Если поле содержит сообщение то далее переходим к операциям (к п. 10). В противном случае - опять выполняется глобальная блокировка.
После того как блокировка установлена, поле r_msg проверяется еще раз. Если в процессе установки блокировки было получено сообщение, то производится переход к операциям (к п. 10).
Если поле r_msg осталось без изменений, то, следовательно, процесс был активирован для выполнения повторной попытки получить сообщение. Проверяется наличие необработанных сигналов для данного процесса и если таковые имеются, то глобальная блокировка снимается и процессу возвращается код EINTR. Иначе - производится попытка получить сообщение.
Если поле r_msg содержит код ошибки, то снимается глобальная блокировка и процессу передается ошибка.
После проверки адреса пользовательского буфера msp, тип сообщения записывается в mtype и содержимое сообщения копируется в поле mtext функцией . И в заключение освобождается память вызовом функции .
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий