W KEXT, odsłuchuję plik close przez vnode lub detektor zakresu plików. Dla niektórych (bardzo nielicznych) plików, muszę wysłać ścieżkę do mojego demona systemu, który wykonuje pewne przetwarzanie (to musi się zdarzyć w daemonie) i zwraca wynik z powrotem do KEXT. Zamknięcie pliku musi zostać zablokowane, dopóki nie otrzymam odpowiedzi od demona. Na podstawie wyniku muszę wykonać operację w trybie bliskiego połączenia i pomyślnie zakończyć połączenie. Istnieje wiele dyskusji na temat tematu komunikacji KEXT na forum. Ale nie są one rozstrzygające i wydają się bardzo stare (rok 2002 wokół). To wymaganie może być obsługiwane przez interfejs API Win32 Win32. Szukam odpowiednika że na MacNajlepszy sposób na komunikowanie się z KEXT do Daemona i blokowanie aż do zwrócenia wyniku z Daemona
Oto co mam spojrzał i chcą podsumować moje rozumienie:
- Mach wiadomość: Zapewnia bardzo dobry sposób komunikacji dwukierunkowej użyciu nadawcę i odpowiadać porty z kolejkowym mechanizmem. Jednak interfejsy API komunikatów mach (na przykład
mach_msg
,mach_port_allocate
,bootstrap_look_up
) nie wydają się być kluczowymi wskaźnikami wydajności. Można użyć interfejsu API Machmach_msg_send_from_kernel
, ale samo to nie pomoże w komunikacji dwukierunkowej. Czy moje zrozumienie jest właściwe? - IOUserClient: To wydaje się być bardziej związane z komunikowaniem się z przestrzeni użytkownika do KEXT, a następnie wywołania zwrotnego z KEXT. Nie znalazłem sposobu na zainicjowanie komunikacji z KEXT do daemona, a następnie czekanie na wynik z daemona. Czy czegoś brakuje?
- Gniazda: To może być ostatnia opcja, ponieważ musiałbym wdrożyć cały dwukierunkowy kanał komunikacji z KEXT do Daemona.
ioct
l/sysctl
: Niewiele o nich wiem. Z tego, co przeczytałem, nie jest to zalecana opcja, szczególnie w przypadku komunikacji dwukierunkowej:- RPC-Mig: Ponownie niewiele o nich wiem. Wygląda na skomplikowaną z tego, co widziałem. Nie jestem pewien, czy to jest zalecany sposób.
- KUNCUserNotification: To wydaje się być po prostu powiadomienie użytkownika z KEXT. Nie spełnia moich wymagań.
Obsługiwana platforma to (10.5). Patrząc na wymagania, czy ktoś może zaproponować i dostarczyć wskazówek na ten temat?
Z góry dziękuję.
Czy znalazłeś przykład, jak zaimplementować to z gniazdami? – gbdavid