2012-01-12 104 views
3

也許標題沒有如此精確地提出問題:我知道當我運行gcc foo.c時,GCC調用其他完成所有工作的子程序,使得主要的gcc程序只是一個接口。但是,這到底如何呢?GCC如何運行其他程序?

是否使用systemexec或其他功能?究其原因,我想知道這一點,因爲我想建立一個基於類似的系統,那裏將是一個接口程序等幾個個子程序,如crawldownload在網絡爬蟲。

對不起,如果這個問題已被問到,但我沒有找到它使用搜索或「類似標題的問題」。

預先感謝您。

回答

4

雖然你的問題實際上更一般化(並且僅以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是從程序中調用子進程的常用方法。

+0

我根本就沒想到strace的,我不是一個Linux的人。是的,這個問題真的很普通。謝謝! – vanneto 2012-01-12 17:30:13

相關問題