海湾合作委员会如何运作其他计划?

时间:2012-01-12 15:34:10

标签: gcc exec

也许标题没有如此准确地说出问题:我知道当我运行gcc foo.c时,GCC会调用其他完成所有工作的子程序,使主要的gcc程序成为一个接口。但这究竟是怎么做到的?

是否使用systemexec或其他功能?我想知道这个的原因是因为我想基于类似的系统构建一个网络爬虫,其中会有一个接口程序和其他几个子程序,如crawldownload

如果这个问题已被提出,我很抱歉,但我没有使用搜索或“类似标题的问题”找到它。

提前谢谢。

1 个答案:

答案 0 :(得分:4)

虽然你的问题非常普遍(并且只使用gcc作为例子),但我的第一个想法是使用strace来弄清楚它在做什么。在我的系统(Ubuntu 11.10 / x64)上,我刚刚运行strace,如下所示:

strace -F -o sout gcc -Wall -o test test.c

这显示系统调用gcc进程,同时跟踪分支(-F)并将跟踪输出发送到sout。这样做,我可以看到gcc在这里调用了vfork(),然后调用了孩子中的execve(),尽管实际程序的源可能只是做一个简单的fork() / {{1 }}

exec()的相关输出是:

sout

每行的begnning是进程运行的pid。因此主要流程调用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 来查找stat(),然后分叉,然后子进程执行它。

话虽这么说,我本可以在没有引用的情况下回答你的问题; fork / exec是从程序中调用子进程的常用方法。