Разработка динамических сайтов
SEO услуги
Управление контекстной рекламой

Вход на хостинг

Имя пользователя:*

Пароль пользователя:*

IT-новости

20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла

Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......

подробнее

30.07.2015 Ищем уникальный контент для сайта

Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......

подробнее

11.05.2015 Распространённые ошибки разработчиков сайтов

Не секрет, что в сети Интернет насчитывается миллионы сайтов, и каждый день появляются тысячси новых......

подробнее

Наш драйвер пока еще не может называться драйвером в прямом смысле этого слова: устройство-то он регистрирует, но не позволяет выполнить ни одной операции с устройством – ведь структура file_operations пуста.

Кроме структуры file_operations, нам еще понадобится структура для хранения информации о состоянии устройства, а так как устройств у нас два, то также нужен массив структур для хранения состояния каждого устройства. Индексами массива будут младшие номера устройств.

// Структура для хранения состояния устройства

struct device_state

{

// 1 – устройство открыто, 0 - закрыто

int dev_open;

// Количество прочитанных байт из устройства

ssize_t byte_read;

// Количество записанных байт

ssize_t byte_write;

};

// Массив для хранения информации о состоянии устройств

static struct device_state state[2];

В принципе можно обойтись и без кода поиска устройств – без него модуль будет проще, да и работать он будет быстрее. А мы знаем, чем проще программа, тем она надежнее. Обойти поиск устройств можно следующим образом. Мы не знаем, сколько устройств типа device будет у конечного пользователя – у него может быть только одно устройство – /dev/device0, а может быть целых 20 устройств – /dev/device0…/dev/device19. Поэтому вместо описанного выше массива state, нужно использовать динамический список, который будет содержать информацию о каждом устройстве типа device. При загрузке модуля он будет содержать всего один элемент – для устройства /dev/device0. Даже если этого устройства не будет в системе, будем считать, что оно просто закрыто, а при попытке обращения к нему будем сообщать, что оно занято. По мере поступления запросов программ на открытие других устройств /dev/deviceX будем добавлять новые элементы в наш список. Чтобы не усложнять код нашего модуля, в этой статье мы не будем использовать динамические структуры – для вас как начинающего разработчика модулей ядра Linux, главное – разобраться с написанием самого модуля, а добавить динамические списки вы можете в любой момент сами.

Если же вам все-таки хочется узнать конкретное количество устройств /dev/deviceX, установленных у пользователя, можно просто просмотреть содержимое каталога /dev и посчитать количество файлов device*.

Все готово для того, чтобы написать функцию открытия устройства.

Листинг 8. Функция открытия устройства

 

static int device_open(struct inode *inode, struct file *fp)

{

struct device_state *dev_state;

 

printk("My module: try  to open device with minor number %d ", MINOR(inode->i_rdev));

dev_state = &state[MINOR(inode->i_rdev)];

 

if(dev_state->dev_open)

{

printk("Devise is busy ");

return -EBUSY;

}

dev_state->dev_open = 1;

dev_state->byte_read = 0;

dev_state->byte_write = 0;


Предыдущая страницаОглавлениеСледующая страница
 
[001] [002] [003] [004] [005] [006] [007] [008] [009] [010] [011] [012] [013] [014] [015] [016] [017] [018] [019] [020]
[021] [022] [023] [024] [025] [026] [027] [028] [029] [030] [031] [032] [033] [034] [035] [036] [037] [038] [039] [040]
[041] [042] [043] [044] [045] [046] [047] [048] [049] [050] [051] [052] [053] [054] [055] [056] [057] [058] [059] [060]
[061] [062] [063] [064] [065] [066] [067] [068] [069] [070] [071] [072] [073] [074] [075] [076] [077] [078] [079] [080]
[081] [082] [083] [084] [085] [086] [087] [088] [089] [090] [091] [092] [093] [094] [095] [096] [097] [098] [099] [100]
[101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] [118] [119] [120]
[121] [122] [123] [124] [125] [126] [127] [128] [129] [130] [131] [132] [133] [134] [135] [136] [137] [138] [139] [140]
[141] [142] [143] [144] [145] [146] [147] [148] [149] [150]

+7 (831) 413-63-27
ООО Дельта-Технология ©2007 - 2023 год
Нижний Новгород, ул. Дальняя, 17А.
Rambler's Top100