Thready a přerušení syscallu signálem

Pavel Kankovsky peak na argo.troja.mff.cuni.cz
Sobota Duben 14 11:51:10 CEST 2007


On Sun, 8 Apr 2007, Ladislav Vaiz wrote:

> 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".

To asi nebude tak úplně změnou jádra. getpid() vrací tgid (thread group 
id) už hodně dlouho, dokonce i pozdější verze 2.4 to dělají.

Problém asi bude v tom, že u Vás po cestě došlo i ke změně userlandové
implementace vláken, nejspíš z LinuxThreads na NPTL. NPTL už používá při
vytváření vláken příznaky, která jádru říkají, že vlákna patří do jedné
skupiny, a tak mají stejný tgid, tedy zvenku pid.

To schizma mezi tím, co je pid v jádře a co je pid v userlandu, je
způsobena právě snahou, aby vlákna v linuxu fungovaly posixově, tj. aby
byl proces, který obsahuje jedno či více vláken, a signály se většinou
posílají celému procesu. Jádro se na to dívá z opačné strany: má
samostatné tasky (vlákna), které mohou sdílet různé věci a mohou se
sdružovat do skupin vláken (procesů v userlandu), a signály se většinou 
posílají konkrétnímu tasku.

Nejlepší je asi použít ten už zmíněný pthread_cancel(). Tím pošlete 
SIGCANCEL vybranému threadu a použité knihovny už zajistí, aby to udělalo 
něco smysluplného.

--Pavel Kankovsky aka Peak  [ Boycott Microsoft--http://www.vcnet.com/bms ]
"Resistance is futile. Open your source code and prepare for assimilation."




Další informace o konferenci Linux