也许标题没有如此准确地说出问题:我知道当我运行gcc foo.c
时,GCC会调用其他完成所有工作的子程序,使主要的gcc程序成为一个接口。但这究竟是怎么做到的?
是否使用system
或exec
或其他功能?我想知道这个的原因是因为我想基于类似的系统构建一个网络爬虫,其中会有一个接口程序和其他几个子程序,如crawl
和download
。
如果这个问题已被提出,我很抱歉,但我没有使用搜索或“类似标题的问题”找到它。
提前谢谢。
答案 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是从程序中调用子进程的常用方法。