linux下C程序運行過程中的系統調用

 首先我們先寫一個最最簡單的程序,helloworld?no,no,helloworld遠遠比我們自己看到的要複雜的多。
最最簡單的程序應該是這樣的

  1. /*kong.c 源碼*/ 
  2. int main(void
  3.   

接下來,靜態編譯,strace跟蹤查看程序的執行情況。

 
  1. leon@leon-virtual-machine:~/Desktop/hello$ gcc kong.c -o kong -static//靜態編譯 
  2. leon@leon-virtual-machine:~/Desktop/hello$ strace ./kong  //跟蹤執行 
  3. execve("./kong", ["./kong"], [/* 40 vars */]) = 0   //系統調用:運行可執行文件 
  4. uname({sys="Linux", node="leon-virtual-machine", ...}) = 0//系統調用:獲取當前UNIX系統的名稱,版本,主機信息等 
  5. brk(0)                                  = 0x8baf000 //系統調用:改變數據段空間的分配,修改堆的大小 
  6. brk(0x8bafd40)                          = 0x8bafd40// 
  7. set_thread_area({entry_number:-1 -> 6, base_addr:0x8baf840, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0//在當前進程的LTS中設置一個入口 
  8. brk(0x8bd0d40)                          = 0x8bd0d40// 
  9. brk(0x8bd1000)                          = 0x8bd1000// 
  10. exit_group(-1081249620)                 = ?        //退出在一個進程裏的所有線程 

如上所示,空程序在執行過程中execve,uname,brk,set_thread_area,exit_group等系統調用
那麼在這些系統調用中,那些是系統本身執行的,那些是程序執行的??
程序源碼本身沒有任何系統調用,但是在靜態編譯中,一些庫被編譯進來,庫在程序執行過程中會不會發生系統調用???
庫在程序運行過程中,是由程序本身調用的,既然空程序中不存在調用庫的代碼,那麼可以理解爲庫在執行過程不會產生系統調用
所以也就是說這些系統調用不是由程序調用產生,都是由系統本身執行的。

通過分析這些系統調用,這些系統調用完成了應用程序運行環境的初始化,程序退出返回的功能。
再來看看另外一個應用程序helloworld的運行過程。

 
  1. *hello.c 源碼*/ 
  2. #include <stdio.h> 
  3. int main(void)  
  4.     printf("hello, FriendlyARM!\n"); 
  5. /***********************************************/ 
  6. leon@leon-virtual-machine:~/Desktop/hello$ gcc hello.c -o hello -static //靜態編譯 
  7. leon@leon-virtual-machine:~/Desktop/hello$ strace ./hello  //跟蹤執行 
  8.  
  9. execve("./hello", ["./hello"], [/* 40 vars */]) = 0 
  10. uname({sys="Linux", node="leon-virtual-machine", ...}) = 0 
  11. brk(0)                                  = 0x9336000 
  12. brk(0x9336d40)                          = 0x9336d40 
  13. set_thread_area({entry_number:-1 -> 6, base_addr:0x9336840, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0 
  14. brk(0x9357d40)                          = 0x9357d40 
  15. brk(0x9358000)                          = 0x9358000 
  16. fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 //獲取文件屬性 
  17. mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb77c3000 //映射文件或設備到內存 
  18. write(1, "hello, FriendlyARM!\n", 20hello, FriendlyARM![/color][color=#ff0000])   = 20 // 寫文件,這裏纔是helloworld程序本身的操作 
  19. exit_group(20)    = ? 

除了fstat64,mmap2,write三個系統調用外,其他系統調用都和空程序的執行過程完全一樣。
很明顯,這三個系統調用就是程序本身的調用執行過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章