也許標題沒有如此精確地提出問題:我知道當我運行gcc foo.c
時,GCC調用其他完成所有工作的子程序,使得主要的gcc程序只是一個接口。但是,這到底如何呢?GCC如何運行其他程序?
是否使用system
或exec
或其他功能?究其原因,我想知道這一點,因爲我想建立一個基於類似的系統,那裏將是一個接口程序等幾個個子程序,如crawl
和download
在網絡爬蟲。
對不起,如果這個問題已被問到,但我沒有找到它使用搜索或「類似標題的問題」。
預先感謝您。
也許標題沒有如此精確地提出問題:我知道當我運行gcc foo.c
時,GCC調用其他完成所有工作的子程序,使得主要的gcc程序只是一個接口。但是,這到底如何呢?GCC如何運行其他程序?
是否使用system
或exec
或其他功能?究其原因,我想知道這一點,因爲我想建立一個基於類似的系統,那裏將是一個接口程序等幾個個子程序,如crawl
和download
在網絡爬蟲。
對不起,如果這個問題已被問到,但我沒有找到它使用搜索或「類似標題的問題」。
預先感謝您。
雖然你的問題實際上更一般化(並且僅以gcc
爲例),但我的第一個想法是使用strace
來弄清楚它在做什麼。在我的系統(Ubuntu的11.10/64),我只是跑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
在每行的begnning是過程運行的PID。所以主進程調用stat()
找到cc1
,然後分叉,子進程執行它。
話雖這麼說,我可以回答,而不引用您的問題; fork/exec是從程序中調用子進程的常用方法。
我根本就沒想到strace的,我不是一個Linux的人。是的,這個問題真的很普通。謝謝! – vanneto 2012-01-12 17:30:13