Comments 9
А вы уверены, что можно вызывать CFRunLoopStop() из обработчика сигнала? Я бы не стал.
Хорошая статья, единственно что — местами слегка сумбурно из-за того, что кроме IOKit вам по ходу дела приходится рассказывать еще и про CoreFoundation.
На счет «виртуальных портов» — IONotificationPortRef, io_iterator_t и прочее — весьма тонкая обертка вокруг Mach порта.
Хорошая статья, единственно что — местами слегка сумбурно из-за того, что кроме IOKit вам по ходу дела приходится рассказывать еще и про CoreFoundation.
На счет «виртуальных портов» — IONotificationPortRef, io_iterator_t и прочее — весьма тонкая обертка вокруг Mach порта.
+1
На счет IOServiceMatching и словаря — дело в том, что в Mac OS X многие интерфейсы используют композицию объектов из CoreFoundation (массивы, словари, строки, числа и тд.) в качестве представления передаваемых данных. Одна из причин — халявная расширяемость и маршаллинг.
Это как в вебе для общения сервисов между собой или браузера с сервером используется JSON, аналогия 1-1.
Это как в вебе для общения сервисов между собой или браузера с сервером используется JSON, аналогия 1-1.
0
Спасибо за замечания. Да действительно, местами возможно немного запутанно и сумбурно, т.к. используя объекты CoreFoundation не мог не упомянуть что это такое и откуда. Про Mach порты уже не стал даже упоминать, что бы еще сильнее не уйти в сторону и не запутать читателей.
По поводу обработчика сигнала тоже соглашусь, идея не очень хорошая, но в данном простом примере решил поступить именно таким, как наиболее простым и наглядным, образом.
Пожалуй добавлю информацию в статью, что в реальных проектах так делать не стоит.
По поводу обработчика сигнала тоже соглашусь, идея не очень хорошая, но в данном простом примере решил поступить именно таким, как наиболее простым и наглядным, образом.
Пожалуй добавлю информацию в статью, что в реальных проектах так делать не стоит.
0
Судя по исходникам, cfrunloopstop перво-наперво лочит rl. Так что это точно не async-signal safe.
Каноническое решение кстати — получать нотификации о сигналах через kqueue, которая добавляется в runloop обернутая в CFFileDescriptor.
void CFRunLoopStop(CFRunLoopRef rl) {
Boolean doWake = false;
CHECK_FOR_FORK();
__CFRunLoopLock(rl);
if (rl->_currentMode) {
__CFRunLoopSetStopped(rl);
doWake = true;
}
__CFRunLoopUnlock(rl);
if (doWake) {
CFRunLoopWakeUp(rl);
}
}
Каноническое решение кстати — получать нотификации о сигналах через kqueue, которая добавляется в runloop обернутая в CFFileDescriptor.
0
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Sign up to leave a comment.
Работа с USB устройствами в программе на C в MacOS X