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