Как python определяет PID, по-видимому, без обычных системных вызовов в Linux?

При запуске следующей команды

strace -f python3 -c 'import os; print(os.getpid())'

Я заметил, что Strace не ловит звонок на getpid(2) системный вызов. Сначала я подумал, что это происходит из-за того, что glibc кэширует pid, но не должно быть pid для кэширования libc без хотя бы одного реального системного вызова. Затем я подумал, что, возможно, виновным было vdso, но запуск программы на C, которая делает этот системный вызов через libc, показывает getpid звоните, когда стеснены. Я наконец сдался и посмотрел на источник os.getpid модуль python, который, по-видимому, определен в Modules/posixmodule.c, К моему удивлению (и последующему замешательству), он делает нормальный вызов getpid!

Итак, мой вопрос: как python определяет результат os.getpid? и если такое значение действительно получается путем вызова getpidкак этот звонок на самом деле делается?

1 ответ

Решение

Работа vdso, помимо прочего, заключается в отображении переменных процесса в пользовательское пространство, которое функции vdso умеют читать. Одним из них является текущий идентификатор процесса, поэтому gettimeofday не нужно делать системный вызов для доступа к этой информации.

Теперь специально для getpidна самом деле это не вызов VDSO. В glibc до версии 2.25 библиотека кэшировала вызовы, а поскольку часть вызовов времени выполнения Python getpidпосле первого звонка не будет. Начиная с версии 2.25 библиотека не кэширует идентификатор процесса, поэтому каждый getpid результаты вызова в системном вызове.

Другие вопросы по тегам