Linux блокирует открытым в качестве альтернативы EBUSY

Когда устройство не доступен, ошибка часто возвращается наиболее разумный подход, но в некоторых случаях пользователь может предпочесть ждать устройства.

 

Например, если канал передачи данных, как ожидается, будет использоваться как для отчета регулярных поставок (с использованием кронтаба), он также используются иногда для нужд пользователей, для операции предпочтительно выполнена с небольшой задержкой, не только потому, что текущий канал занят не удалось.

 

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

 

Альтернатива EBUSY, как вы, возможно, думали, чтобы добиться открытого scullwuid блокировки устройства является устройством ожидания в открытом вместо возвращения -EBUSY sculluid версии отличается от sculluid открыл работать только в следующем разделе ..:

 

spin_lock (& ​​scull_w_lock); в то время как (! scull_w_available ())

{

spin_unlock (& ​​scull_w_lock);

если (filp-> f_flags & O_NONBLOCK) возвращение -EAGAIN;

если (wait_event_interruptible (scull_w_wait, scull_w_available ())) возвращают -ERESTARTSYS; / * Скажите фс слой обработать его * /

spin_lock (& ​​scull_w_lock);

}

если (scull_w_count == 0)

scull_w_owner = current-> UID; / * Захватить его * / scull_w_count ++;

spin_unlock (& ​​scull_w_lock);

 

Эта реализация основана на очередь ожидания снова. Если устройство не в настоящее время, процесс пытается открыть его помещаются в очередь, пока процесс не закрыл оборудование.

 

Способ выпуска, то, отвечает за незавершенным процесс пробуждения:

 

Статическая INT scull_w_release (структура инф.узлы * инод, структура файл * Filp)

{

 

ИНТ темп; spin_lock (& ​​scull_w_lock); scull_w_count--;

Темп = scull_w_count; spin_unlock (& ​​scull_w_lock);

если (темп == 0)

wake_up_interruptible_sync (& scull_w_wait); / * Просыпаются другой UID в * / возврат 0;

}

 

Это пример того, где это имеет смысл называть wake_up_interruptible_sync. Когда мы делаем это проснуться, мы просто хотим, чтобы вернуться в пространство пользователя, который является естественной системой для точки планирования. Когда мы не просыпаемся это потенциально повторное планирования, наиболее а просто назвать «синхронизации» версии и завершить нашу работу.

 

Открытые вопросы, блокирующие выполнение действительно плохи для интерактивного пользователя, они должны догадаться, что пошло не так. Интерактивные пользователи часто называют стандартные команды, такими как ср и деготь, и не могут добавить O_NONBLOCK к открытому вызову. Там

 

Некоторые используют ленточные накопители для резервного копирования людей хотели бы иметь простое «устройство или ресурс занято» сообщение, вместо того, чтобы быть отброшено угадать, как жесткие диски сегодня настолько тихо, то деготь следует сканировать его.

 

Такие проблемы (требует иной, несовместимую политики для того же самого устройство) для достижения наилучшего быть достигнуты с помощью узла устройства для каждой политики доступа. Пример такого подхода может быть найдены в накопителе на магнитной ленте Linux, которая обеспечивает множество файлов устройства для того же самого устройства. например, различные файлы драйвера устройства не будут использовать сжатие или запись, или автоматическую перемотку ленту, когда устройство выключено.

рекомендация

отwww.cnblogs.com/fanweisheng/p/11141908.html