2012-01-12 2 views
3

제목이 너무 정확하게 질문하지는 않을 것입니다 : 나는 gcc foo.c을 실행할 때 GCC가 모든 작업을 수행하는 다른 하위 프로그램을 호출하여 주 gcc 프로그램을 인터페이스로 만듭니다. 그러나 이것이 정확히 어떻게 이루어 졌는가?GCC는 어떻게 다른 프로그램을 실행합니까?

system 또는 exec 또는 다른 기능을 사용합니까? 왜냐하면 비슷한 시스템을 기반으로 웹 크롤러를 만들고 싶기 때문입니다. 여기에는 인터페이스 프로그램과 crawldownload과 같은 몇 가지 하위 프로그램이 있습니다.

이 질문에 이미 질문을했지만 검색이나 "비슷한 제목의 질문"을 사용하여 찾지 못해 죄송합니다.

미리 감사드립니다.

답변

4

질문이 실제로 더 일반적이지만 (예 : gcc 만 사용), 내 생각은 strace을 사용하여 수행중인 작업을 파악하는 것입니다. 포크 (-F를) 다음과 sout에 추적의 출력을 보내는 동안,

strace -F -o sout gcc -Wall -o test test.c 

이것은 gcc 프로세스에 대한 시스템 호출을 보여줍니다 내 시스템 (우분투 11.10/64)에, 난 그냥, strace를 실행 너무있다. 이렇게하면 gccvfork(), 그 다음은 execve()이 자식에 있지만 실제로는 프로그램 소스가 fork()/exec() 일 뿐이라는 것을 알 수 있습니다. sout에서

관련 출력은 각 라인의 begnning에서

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/exec는 프로그램에서 하위 프로세스를 호출하는 일반적인 방법입니다.

+0

나는 strace를 생각조차하지 않았고, 나는 리눅스 사람이 아닙니다. 그래, 그 질문은 정말로 일종의 일반적인 질문이다. 고맙습니다! – vanneto

관련 문제