Файловый ввод-вывод с помощью KEXT на Mac

Замечено, что есть API vn_xxx для выполнения операции над файлом, например, vn_rdwr(...). Из сетевого поиска выяснилось, что vn_rdwr(...) использовать не рекомендуется.

Несколько запросов вокруг одного и того же:

  • Является ли этот vn_xxx API несовместимым с версиями Mac OS X?
  • Разве это не безопасно? Есть ли какие-нибудь примеры, на которые я мог бы посмотреть, как используется vn_rdwr?
  • Есть ли какие-либо альтернативы, кроме делегирования файлового ввода-вывода демону?

Было бы здорово, если бы кто-то мог предоставить комментарии\предложения?


person RHK    schedule 18.05.2012    source источник
comment
Я не могу говорить о своем опыте работы с этими функциями, но обратите внимание, что большинство из них не объявлены внутри блоков #ifdef KERNEL_PRIVATE, поэтому их API не должны меняться обратно несовместимыми способами между версиями. Быстрая проверка с помощью тестового кекста должна сказать вам, действительно ли кексты могут ссылаться на них. Поскольку я не использовал их, я не могу комментировать, следует ли. Однако вся документация, которую я видел, конкретно не рекомендует файловый ввод-вывод на основе ядра. Я подозреваю, что это связано с безопасностью потоков - если вы должны позвонить им, я бы посоветовал сделать это из выделенного потока.   -  person pmdj    schedule 20.05.2012


Ответы (1)


Я считаю, что vn_rdwr() безопасен и гарантированно совместим.

Причина, по которой это обычно не рекомендуется, заключается в том, что это очень низкий уровень. Используя его, вы эффективно обходите любые разрешения файлов FS, избегаете вызовов обратных вызовов, зарегистрированных через KAuth API (например, Spotlight не видит таких изменений) и т. д. В большинстве случаев вы должны выполнять ввод-вывод в пользовательском пространстве (например, какой-то демон) .

Используйте ввод-вывод в KExt, только если у вас действительно есть для этого веские причины. Если у вас есть, используйте vn_rdwr().

person mity    schedule 23.05.2012