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

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

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

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

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

1 Ответ

0 голосов
/ 18 сентября 2018

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

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

...