Документация может быть довольно запутанной, поэтому вот « настоящая » модель Linux:
- внутри ядра Linux то, что может быть запущено (и запланировано), называется «процессом»,
- каждый процесс имеет уникальный системный идентификатор процесса (PID) и идентификатор группы потоков (TGID),
- «нормальный» процесс имеет PID = TGID, и никакой другой процесс не разделяет это значение TGID,
- «многопоточный» процесс - это процесс, значение TGID которого совместно используется другими процессами,
- несколько процессов, совместно использующих один и тот же TGID, также совместно используют, по крайней мере, одно и то же пространство памяти и обработчики сигналов (иногда больше),
- если «многопоточный» процесс имеет PID = TGID, его можно назвать «основным потоком»,
- вызов
getpid()
любого процесса вернет его TGID (= PID "основного потока"),
- вызов
gettid()
любого процесса вернет его PID (!),
- любой процесс может быть создан с помощью
clone(2)
системного вызова,
- числовые имена папок, которые вы можете перечислить
ls /proc
как /proc/NUMBER
TGID,
- числовые имена папок в
/proc/TGID/task
виде /proc/TGID/task/NUMBER
PID,
- даже если вы не видите все существующие идентификаторы PID
ls /proc
, вы все равно можете их увидеть cd /proc/any_PID
.
Вывод : с точки зрения ядра существуют только процессы, каждый из которых имеет свой уникальный PID, а так называемый поток - это просто другой тип процесса.
Примечание: реализация концепции «потока» в Linux привела к путанице в словарном запасе, и если getpid()
обманывает вас , не делает то, что вы думали, это потому, что его поведение следует совместимости с POSIX (потоки должны иметь общий PID) ,