GCC如何运行其他程序?

GCC如何运行其他程序?,gcc,exec,Gcc,Exec,也许标题并没有这么准确地表达这个问题:我知道当我运行gcc foo.cgcc调用其他子程序来完成所有工作时,gcc主程序只是一个接口。但这究竟是如何做到的呢 它是否使用system或exec或其他功能?我之所以想知道这一点,是因为我想基于类似的系统构建一个网络爬虫程序,其中会有一个接口程序和几个其他子程序,如crawl和download 如果这个问题已经被问过,我很抱歉,但是我没有通过搜索或“类似标题的问题”找到它 提前谢谢。虽然您的问题实际上更一般(并且仅以gcc为例),但我的第一个想法是使用

也许标题并没有这么准确地表达这个问题:我知道当我运行
gcc foo.c
gcc调用其他子程序来完成所有工作时,gcc主程序只是一个接口。但这究竟是如何做到的呢

它是否使用
system
exec
或其他功能?我之所以想知道这一点,是因为我想基于类似的系统构建一个网络爬虫程序,其中会有一个接口程序和几个其他子程序,如
crawl
download

如果这个问题已经被问过,我很抱歉,但是我没有通过搜索或“类似标题的问题”找到它


提前谢谢。

虽然您的问题实际上更一般(并且仅以
gcc
为例),但我的第一个想法是使用
strace
来了解它在做什么。在我的系统(Ubuntu 11.10/x64)上,我刚刚运行了
strace
,如下所示:

strace -F -o sout gcc -Wall -o test test.c
这显示了系统对
gcc
进程的调用,同时遵循fork(
-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
26264 stat(“/usr/lib/gcc/x86_64-linux-gnu/4.6.1/cc1”,{st_mode=S|IFREG | 0755,st_size=11248824,…})=0
26264访问(“/usr/lib/gcc/x86_64-linux-gnu/4.6.1/cc1”,X_OK)=0
26264 vWork()=26265
26264-4(26265,
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-64”、“-auxbase”、“-test”、“-Wall”、“-fstack”、“-var46*)/]
在每行的开头是正在运行的进程的pid。因此,主进程调用
stat()
来查找
cc1
,然后分叉,子进程执行它


话虽如此,我本可以在没有引用的情况下回答您的问题;fork/exec是从您的程序中调用子进程的常用方式。

我甚至没有想到strace,我不是Linux用户。是的,这个问题确实有点笼统。谢谢!