Thready a přerušení syscallu signálem
Ladislav Vaiz
spam na nagano.cz
Středa Duben 11 15:49:32 CEST 2007
Ahoj,
ve své už zmiňované aplikaci potřebuji vytvořit worker thread, který
bude zapisovat/číst ze zvukovky. Při stisku klávesy jej potřebuji pokud
možno okamžitě ukončit. Pod jádrem 2.6.7 pošlu vláknu SIGINT a vše
funguje tak, jak chci, thread se ukončí typicky za 3ms. Pod 2.6.18 se
ale chová jinak funkce getpid(), vrací PID "hlavního programu". Kill
pošle SIGINT sám sobě, syscall ve vláknu se nepřeruší.
Vlákna vytvářím přes gthread, ale není problém program přepsat pro jinou
knihovnu. Obávám se ale, že si s jinou knihovnou nepomůžu.
Otázky:
1) Jak nejlépe přerušit syscall v threadu, jehož jsem rodičem?
2) Pokud přes signál, jak zjistim PID vlákna? Jaký je v linuxu vztah
mezi vláknem a procesem? Vzpomínám si, že Linux z nějakého podobného
důvodu nesplňoval POSIX.
Zajímá mě pokud možno univerzální řešení, ale v nouzi i postupy pro
různá jádra.
Pozn.: Čtení dat po "malých kouscích" nevede k cíli, některé zvukovky
vrací první byty, až když přečtou např celých 64KB, pak vrátí celých
64KB najednou. To lze omezit přes ioctl SNDCTL_DSP_SETFRAGMENT, ale
probémem zůstává spolehlivé odebírání dat na pomalých strojích.
Díky Láďa
Další informace o konferenci Linux