Стрейс, как увидеть системный вызов форка?

На старых 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.

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