Linux llseek достижения

Метод llseek реализует и система llseek lseek вызовы. Мы уже сказали, что если метод llseek отсутствует в работе устройства, реализация ядра по умолчанию смещается путем изменения filp-> f_pos, это текущая позиция в файле чтения и записи Обратите внимание, чтобы правильно работать для lseek системных вызовов, читать и писать методы должны сотрудничать, используя и обновление параметров, которые они получают в качестве термина смещения.

 

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

 

loff_t scull_llseek (структура файла * Filp, loff_t прочь, ИНТ откуда)

{

структура scull_dev * DEV = filp-> private_data; loff_t newpos;

 

Переключатель (откуда)

{

Случай 0: / * SEEK_SET * /

newpos = OFF; перерыв;

 

Случай 1: / * SEEK_CUR * /

newpos = filp-> f_pos + OFF; перерыв;

 

Случай 2: / * SEEK_END * /

newpos = dev-> площадь + выключен; перерыв;

 

по умолчанию: / * не может произойти * / возврат -EINVAL;

}

если (newpos <0)

вернуться -EINVAL; filp-> f_pos = newpos; вернуться newpos;

}

 

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

 

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

 

INT nonseekable_open (структура инф.узлы * инод; структура файл * Filp);

 

Этот вызов идентифицирует данный Filp не смещается; lseek ядро ​​не допускает вызов от успеха на такой файл, идентифицирующий файл таким образом, вы не будете определяться pread и pwrite системных вызовов. способ, чтобы попытаться сместить документ.

 

Ради полноты картины следует также установить на специальный метод llseek функции помощи в вашей структуре no_llseek нереализованным, который определен в <Linux / fs.h>.

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

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