也许标题并没有把问题说得那么准确:我知道当我运行 gcc foo.c
时,GCC 会调用其他为它完成所有工作的子程序,从而生成主 gcc 程序只是一个界面。但这究竟是如何完成的呢?
它是否使用system
或exec
或其他一些功能?之所以想知道这个是因为我想基于类似的系统构建一个网络爬虫,其中会有一个接口(interface)程序和几个其他子程序,如 crawl
和 download
.
如果这个问题已经被问过但我没有使用搜索或“具有相似标题的问题”找到它,我很抱歉。
提前谢谢你。
最佳答案
虽然您的问题确实更笼统(并且仅以 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,子进程执行。
话虽如此,我本可以在没有引用的情况下回答您的问题; fork/exec 是从程序中调用子进程的常用方法。
关于gcc - GCC 如何运行它的其他程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8837696/