При выполнении следующей команды
strace -f python3 -c 'import os; print(os.getpid())'
Я заметил, что strace не перехватывает вызов системного вызова getpid
(2). Сначала я подумал, что это произошло из-за того, что glibc кэширует pid, но не должно быть pid для кэширования libc без хотя бы одного реального системного вызова. Затем я подумал, что, возможно, виновником был vdso, но запуск программы на C, которая выполняет этот системный вызов через libc, показывает вызов getpid
при трассировке. В конце концов я сдался и посмотрел исходный код модуля Python os.getpid
, который, по-видимому, определен в Modules/posixmodule.c
. К моему удивлению (и последующему замешательству), он делает обычный вызов getpid
!
Итак, мой вопрос: как python определяет результат os.getpid
? и если такое значение действительно получено вызовом getpid
, как на самом деле выполняется этот вызов?
strace -e trace=getpid -f python3 -c 'import os; print(os.getpid())'
показал два вызова системного вызова getpid, когда я тестировал его. - person Shawn   schedule 18.09.2018trace=getpid
на двух разных системах (к сожалению, на обеих одна и та же версия ubuntu, 16.04). Оба печатают PID, но не показывают вызовgetpid
; только '+++ завершился с 0 +++'. - person Tenders McChiken   schedule 18.09.2018getpid(2)
libc. Что бы это ни делало, это то, что делает Python. - person Keith   schedule 18.09.2018