Мне нужны уведомления о файловой системе в Mac OS X, и я читаю из / dev / fsevents. Пример кода захвата fsevents в Mac OS X: http://www.codecollector.net/view/1066/raw_fsevents. В этом коде вы можете видеть, что буфер чтения из / dev / fsevents обрабатывается, как только он читается. Но когда я это делаю, события отсутствуют из-за задержки, создаваемой при обработке. Итак, я создал новый указатель на char и memcpy’d буфер, считанный из / dev / fsevents, и добавил новый char * в очередь и обработал очередь в новом потоке. Но когда я обрабатываю char * как в ‘print_event’ & ‘dump_entry’, указатель char * снова выравнивается, и когда я проверяю на strlen () после обработки, он говорит, что длина 0 или 1 байт. Так что во время обработки память подтекает.
Любая идея, как удалить выделенный символ *, это утечка памяти для большего количества событий. Пожалуйста, поделитесь своими мыслями по этому поводу. Заранее спасибо.
Просто любопытно: любая причина, по которой вы вручную обрабатываете / dev / fsevents, а не используете FSEvents интерфейс, который предназначен для взаимодействия с ним (по крайней мере, для наиболее распространенных случаев)? С / dev / fsevents довольно сложно общаться напрямую. Ars Technica сделали хорошую рецензию.
Для такого рода кода я бы избавился от malloc и memcpy. Это добавит много накладных расходов на управление очередью. И я бы ушел от ручного управления потоками. Это именно та проблема, для решения которой GCD предназначена, в частности, с использованием dispatch_data. Это позволяет вам создавать неизменяемые блоки памяти, которые вы можете обрабатывать и манипулировать, не требуя копирования. Вы можете создать dispatch_source для чтения / dev / fsevents и передать вам объекты dispatch_data. Увидеть Чтение данных из дескриптора раздел руководства по программированию параллелизма для примера.
Не совсем понятно, что вы подразумеваете под «указателем char *». Вы хотите изменить одну переменную в двух потоках без блокировок?
Но если вам действительно не нужен необработанный доступ, я бы посмотрел на интерфейс FSEvents.
Других решений пока нет …