использование функций sysfs show () и store () - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть 2 вопроса относительно использования этих функций.Я не совсем понимаю документацию, написанную здесь :

sysfs выделяет буфер размера (PAGE_SIZE) и передает его методу.Sysfs будет вызывать метод ровно один раз для каждого чтения или записи.Это приводит к следующему поведению в реализациях метода:

  • В read (2) метод show () должен заполнить весь буфер.Напомним, что атрибут должен экспортировать только одно значение или массив схожих значений, поэтому это не должно быть так дорого.

    Это позволяет пользовательскому пространству выполнять частичное чтение и произвольный поиск вперед по всему файлу по желанию.Если пользовательское пространство стремится к нулю или выполняет pread (2) со смещением '0', метод show () будет вызван снова, с изменением структуры для заполнения буфера.

  • Вкл.write (2), sysfs ожидает, что весь буфер будет передан во время первой записи.Затем Sysfs передает весь буфер методу store ().Завершающий ноль добавляется после данных о магазинах.Это делает функции, подобные sysfs_streq (), безопасными для использования.

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

Во-первых, когда я читаю / записываю в файл атрибута sysfs с read/write, я гарантирую, что буфер, который я читаю в / буфер в функции storeбудут ли все байты, которые я хотел прочитать в этой функции, и не вызывать ее несколькими кусками?

Кроме того, как добавляется нулевой символ?То есть, предположим, я написал n байтов, будет ли количество записанных байтов в параметре функции n, а нулевой символ будет помещен в n + 1?

спасибо

1 Ответ

0 голосов
/ 23 ноября 2018

Ответ на первые вопросы: да - частичные записи не поддерживаются, и буфер всегда заполняется одним вызовом метода show.

Ответ на второй вопрос также да.См. Реализацию kernfs_fop_write(), которая используется sysfs - она ​​будет выделять до PAGE_SIZE + 1 байт, чтобы было достаточно места для размещения \ 0.

...