Хотя ваш вопрос действительно носит более общий характер (и в качестве примера используется только gcc
), моей первой идеей было бы использовать strace
, чтобы выяснить, что он делает.В моей системе (Ubuntu 11.10 / x64) я просто запустил strace
, например:
strace -F -o sout gcc -Wall -o test test.c
Это показывает системные вызовы для процесса gcc
, при этом следуя за форками (-F
) и отправкойвывод трассы до sout
.Делая это, я вижу, что gcc
здесь вызывает vfork()
, а затем execve()
в дочернем элементе, хотя фактический источник программы может просто сделать простой fork()
/ exec()
.
.соответствующий вывод от sout
:
26264 stat("/usr/lib/gcc/x86_64-linux-gnu/4.6.1/cc1", {st_mode=S_IFREG|0755, st_size=11248824, ...}) = 0
26264 access("/usr/lib/gcc/x86_64-linux-gnu/4.6.1/cc1", X_OK) = 0
26264 vfork() = 26265
26264 wait4(26265, <unfinished ...>
26265 execve("/usr/lib/gcc/x86_64-linux-gnu/4.6.1/cc1", ["/usr/lib/gcc/x86_64-linux-gnu/4."..., "-quiet", "-imultilib", ".", "-imultiarch", "x86_64-linux-gnu", "test.c", "-quiet", "-dumpbase", "test.c", "-mtune=generic", "-march=x86-64", "-auxbase", "test", "-Wall", "-fstack-protector", ...], [/* 46 vars */]) = 0
В начале каждой строки находится pid запущенного процесса.Итак, основной процесс вызывает stat()
, чтобы найти cc1
, затем разветвляется, и ребенок выполняет его.
При этом я мог бы ответить на ваш вопрос без цитирования;fork / exec - это распространенный способ вызова подпроцессов из вашей программы.