Метод show()
вызывается при чтении файла. Он должен выполнить копирование значения атрибута, который передается в качестве параметра attr
, в буфер, на который указывает параметр buffer
. Размер буфера равен PAGE_SIZE
байт. Для аппаратной платформы значение PAGE_SIZE
равно 4096 байтов. Функция должна возвратить количество байтов данных, которые записаны в буфер в случае успешного завершения, и отрицательный код ошибки, если такая ошибка возникает.
Метод store()
вызывается при записи. Он должен скопировать size
байт данных из буфера buffer
в атрибут attr
. Размер буфера всегда равен PAGE_SIZE
или меньше. Функция должна возвратить количество байтов данных, которые прочитаны из буфера при успешном выполнении, и отрицательный код ошибки в случае неудачного завершения.
Так как этот набор функций должен выполнять операции ввода-вывода для всех атрибутов, то необходимо выполнить некоторые дополнительные действия, чтобы вызвать обработчик, специфичный для каждого атрибута.
Обычно атрибутов, которые используются по умолчанию и предоставляются типом ktype
, связанным с объектом kobject
, оказывается достаточно. Действительно, все объекты kobject
одного типа должны быть чём-то похожи друг на друга или даже быть идентичными по своей природе. Например, для всех разделов жестких дисков один и тот же набор атрибутов должен подходить для всех объектов kobject
. Это не просто упрощает жизнь, но и позволяет упорядочить код и получить одинаковый способ доступа ко всем каталогам файловой системы sysfs, связанным с родственными объектами.
Тем не менее иногда требуется, чтобы определенный экземпляр объекта kobject
имел некоторые специфические свойства. Для таких объектов может оказаться желательным (или необходимым) создать атрибут, которого нет у общего типа данного объекта. Для такого случая ядро предоставляет функцию sysfs_create_file()
для добавления атрибута к существующему объекту.
int sysfs_create_file(struct kobject *kobj, const struct attribute *attr);
Эта функция позволяет привязать структуру attribute, на которую указывает параметр attr
, к объекту kobject
, на который указывает параметр kobj
. Перед тем как вызвать эту функцию, необходимо установить значение атрибута (заполнить поля структуры). Эта функция возвращает значение нуль в случае успеха и отрицательное значение в случае ошибки.
Обратите внимание, что для обработки указанного атрибута используется структура sysfs_ops
, соответствующая типу ktype
объекта. Иными словами, существующие функции show()
и store()
, которые используются для объекта по умолчанию, должны иметь возможность обработать вновь созданный атрибут.
Кроме того, существует возможность создавать символьные ссылки. Создать символьную ссылку на файловой системе sysfs можно с помощью вызова следующей функции.
int sysfs_create_link(struct kobject *kobj,
struct kobject *target, char *name);
Эта функция создает символьную ссылку с именем name
в каталоге объекта, соответствующего параметру kobj
, на каталог, соответствующий параметру target
. Эта функция возвращает нулевое значение в случае успеха и отрицательный код ошибки в противном случае.
Удаляется атрибут с помощью вызова функции sysfs_remove_file()
.
void sysfs_remove_file(struct kobject *kobj,
const struct attribute *attr);
После возврата из этой функции указанный атрибут больше не отображается в каталоге объекта.
Символьная ссылка, созданная с помощью функции sysfs_create_link()
, может быть удалена с помощью функции sysfs_remove_link()
.
void sysfs_remove_link(struct kobject *kobj, char *name);
После возврата из функции символьная ссылка с именем name удаляется из каталога, на который отображается объект kobj
.
Все эти четыре функции объявлены в файле
. Функции sysfs_create_file()
и sysfs_remove_file()
определены в файле fs/sysfs/file.c
, а функции sysfs_create_link()
и sysfs_remove_link()
— в файле fs/sysfs/symlink.c
.