Стрейс, как увидеть системный вызов форка?
На старых SystemV Unix с помощью программы "truss" (похожей на strace)
truss script.sh
.....
fork() = 382
6
Received signal #18, SIGCLD, in waitsys() [default]
siginfo: SIGCLD CLD_EXITED pid=382 uid=0 status=0x0000
.....
В длинном выводе я вижу системный вызов fork(). Я хочу увидеть то же самое (или подобное) в Linux с помощью strace.
я пытался
strace -e fork sh script.sh
а также
strace -f sh script.sh
а также
strace -f -e fork sh script.sh
Но я не вижу вилку (). Linux и старый SystemV, конечно, разные ОС, и, вероятно, Unix использует fork() иначе, чем Linux, но вопрос в том, как увидеть вывод fork() с помощью strace? Конечно, script.sh содержит одну и ту же команду "ls|wc -l" в обеих системах, я использую ее только для тестирования.
1 ответ
Текущие версии Linux предоставляют системный вызов с именем clone(2)
(см. https://linux.die.net/man/2/clone и прокрутите вниз до описанияsys_clone
), который является общим системным вызовом для создания новых задач. Существуют варианты, позволяющие точно определить, какие ресурсы новая задача должна совместно использовать со своим родительским (память, файловые дескрипторы и т. Д.), Чтобы системный вызов можно было использовать для создания новых процессов или новых потоков или чего-либо промежуточного. Хотя ядро по-прежнему предоставляетfork
системный вызов для обратной совместимости, текущие версии glibc реализуют fork()
с точки зрения clone(2)
вместо.
Таким образом, даже если вы можете увидеть вызов fork()
в исходном коде sh
, выход strace
покажет clone
системный вызов. Так что вы должны искать это вместоfork
.