когда используется системный вызов set_tid_address? - PullRequest
2 голосов
/ 07 августа 2011

Я пытался выполнить системные вызовы и хочу понять, как работает set_tid_address. Основное из того, что я прочитал, это то, что он возвращает pid программы или процесса, который выполняется.

Я проверил это с помощью ls, однако с некоторыми командами, такими как uptime, top и т. Д. Я не вижу использования set_tid_address. Почему это так?

Ответы [ 2 ]

4 голосов
/ 08 августа 2011

Системный вызов clone() может принимать флаг CLONE_CHILD_CLEARTID, что значение в child_tidptr (другой аргумент clone()) очищается, и связанный с ним futex сигнализирует о пробуждении при выходе из дочернего потока.Это используется для реализации pthread_join() (родительский поток ожидает на futex).

set_tid_address() позволяет pthread_join() на начальном потоке.Дополнительная информация в следующих потоках LKML:

[patch] исправление потоков, tid-2.5.47-A3
[patch] user-vm-unlock-2.5.31-A2

Почему одни программы вызывают set_tid_address(), а другие нет, ответ прост.Программы, связанные (прямо или косвенно) с вызовом libpthread set_tid_address.ls связан с librt, который связан с libpthread, поэтому он запускает инициализацию для NPTL.

0 голосов
/ 07 августа 2011

В соответствии с Руководством для программиста Linux , set_tid_address используется для:

установить указатель на идентификатор потока

Когда он закончен, он возвращает PID вызывающего процесса. К сожалению, руководство неясно, когда вы действительно хотите использовать этот системный вызов.

В любом случае, почему вы думаете, что эти команды используют set_tid_address?

...