Как GCC запускает свои другие программы? - PullRequest
3 голосов
/ 12 января 2012

Может быть, название не так точно задает вопрос: я знаю, что когда я запускаю gcc foo.c, GCC вызывает другие подпрограммы, которые выполняют всю работу за него, превращая основную программу gcc просто в интерфейс. Но как именно это сделать?

Использует ли он system или exec или какую-либо другую функцию? Причина, по которой я хочу это знать, заключается в том, что я хочу создать веб-сканер на основе аналогичной системы, в которой была бы интерфейсная программа и несколько других подпрограмм, таких как crawl и download.

.

Извините, если этот вопрос уже задавался, но я не нашел его с помощью поиска или "Вопросы с похожими заголовками".

Заранее спасибо.

1 Ответ

4 голосов
/ 12 января 2012

Хотя ваш вопрос действительно носит более общий характер (и в качестве примера используется только 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 - это распространенный способ вызова подпроцессов из вашей программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...