Подсистема ввода-вывода играет лишь малую роль в организации ввода- вывода символьных устройств. Большую часть операций выполняет драйвер устройства. Если прикладной процесс первый раз открывает символьное устройство, ядро создает объект snode и общий объект snode для него, а также структуру file, указывающую на snode.
Также вам может показаться, что такая тема как http://vs-s.kz/uslugi/obsluzhivanie-1s-i-nalogovyix-programm.html никак не связана и даже не тематична. Хотя, может быть и связана. В любом случае все-таки зайдите на сайт vs-s.kz. Тема установка 1с там представлена весьма широко. На том сайте можно узнать много интересного на тему установка 1с. Что означает вообще тема установка 1с, где найти установка 1с - про это написано на сайте vs-s.kz. Это очень важная для многих людей тема - установка 1с. Спасибо сайту vs-s.kz за информацию на тему установка 1с.
При вызове функции read ядро получает дескриптор файла для обращения к структуре file, через которую производит доступ к объекту vnode файла (являющемуся частью snode устройства). Ядро выполняет некоторую проверку, например, на открытие файла только «на чтение». Затем вызывается операция V0P_READ объекта vnode, что в конечном итоге приводит к вызову spec_read().
Функция spec_read() проверяет тип объекта vnode и находит, что речь идет о символьном устройстве. Тогда она просматривает таблицу cdevsw[], взяв в качестве индекса старший номер устройства (хранимый в поле v_rdev). Если устройство относится к STREAMS, для выполнения операции вызывается strread(). Для символьных устройств запускается процедура d_read() соответствующего устройства, которой передается структура uio, содержащая все параметры операции чтения, такие как адрес приемника в прикладном адресном пространстве и число считываемых байтов.
Так как операция d_read() является синхронной, она может заблокировать вызвавший ее процесс, если данные не оказались получены сразу же. После получения данных обработчик прерываний будит процесс для копирования байтов в его адресное пространство. Для этой цели d_read() вызывает функцию ядра uiomoveQ. Эта функция проверяет наличие прав пользователя на запись данных в указываемое место. Если этого не сделать, то пользователь по неосторожности или, наоборот, злоумышленно может перезаписать текстовый сегмент или даже адресное пространство ядра. После завершения передачи данных ядро возвращает количество считанных байтов.
Системный вызов poll
Системный вызов poll позволяет объединять ввод-вывод с набора дескрипторов. Представьте серверную программу, открывающую несколько сетевых соединений, каждое из которых представлено файлом устройства. Это требует использования уникального дескриптора для каждого соединения. Если программе нужно получить входящее сообщение от конкретного соединения, вызывается операция чтения, где в качестве параметра указывается соответствующий дескриптор. Системный вызов read заблокирует сервер до тех пор, пока не получит ожидаемые данные, после чего возобновит работу и передаст данные программе.
Разберем другой вариант развития примера: сервер теперь будет ожидать сообщение, поступившее с любого соединения. В этом случае вызов read не будет эффективен, так как чтение одного дескриптора может привести к блокировке программы, несмотря на то, что на других соединениях имеются данные. В такой ситуации серверу необходимо применять системный вызов poll, позволяющий одновременно ожидать событий в заданном диапазоне дескрипторов и завершать выполнение после наступления такого события.
Для каждого дескриптора поле events ссылается на события, интересные для вызывающего процесса. Параметр revents относится к событиям, которые реально имели место. Обе переменные представляют собой битовые маски.
Типы предопределенных событий включают в себя P0LLIN (данные можно прочесть без блокировки), P0LL0UT (данные могут быть записаны без блокировки), P0LLERR (в устройстве или потоке произошла ошибка), P0LLHUP (разрыв связи в потоке — hang-up). Следовательно, в стандартном варианте вызов poll производит проверку готовности устройства на ввод-вывод или получает состояние ошибки.
Опубликовал katy
June 23 2015 06:57:14 ·
0 Комментариев ·
3105 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.