gcc - GCC 如何运行它的其他程序?

标签 gcc exec

也许标题并没有把问题说得那么准确:我知道当我运行 gcc foo.c 时,GCC 会调用其他为它完成所有工作的子程序,从而生成主 gcc 程序只是一个界面。但这究竟是如何完成的呢?

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

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

提前谢谢你。

最佳答案

虽然您的问题确实更笼统(并且仅以 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/

相关文章:

execvpe 函数的编译器警告

php - 使用PHP exec()加速后端的可行性

arrays - 从两个文件中读取变量并以模式输出到第三个文件

c++ - 如何使用 gcc 编译 C++ 代码的特定部分

c - 为什么这个 printf 语句没有被执行

c - 如何禁用 avr-gcc 的 "appears to be a misspelled interrupt handler"警告?

php - 通过 exec() 从 php 调用 php 没有结果

linux - 为什么程序没有执行这个C编程或unix编程中的某些语句(execvp()系统调用)?

c++ - "is private within this context"被抛出用于不应该是私有(private)的函数(GCC 5.3.0,C++11)

linux - Qt 5.5.1 在 Archlinux 上编译结果错误 : this use of "defined" may not be portable [-Wexpansion-to-defined]