天天看點

Linux系統程式設計——程序(一)

目錄

一、什麼是程序

二、程序的“生老病死”

三、程序相關函數

一、什麼是程序

  • 程序是程式執行的動态過程
  • 程序是資源管理的最小機關(線程是系統排程的最小機關)
  • 在linux中,我們可以通過 file 檔案名 得知一個檔案的檔案類型,以一個可執行程式為例,如下圖所示
Linux系統程式設計——程式(一)
  • 由上面可以得知,大多數的可執行程式的格式為ELF格式。那麼一個可執行程式,是如何被linux運作起來的呢?如下圖所示

 當ELF格式的可執行程式被執行的時候,程式被加載到記憶體中執行,此時核心産生了一個名為task_struct{}的結構體來表示與管理這個程序。

其中:

  • .text 段存放代碼,隻讀并且共享,這段記憶體在程式運作期間不會被釋放
  • .data段存放已經初始化的全局變量和已經初始化的static變量,可讀可寫,這段記憶體在程式運作期間一直存在。
  • .bss段存放未初始化的全局變量和未初始化的static變量,可讀可寫,這段記憶體在程式運作期間一直存在。
  • .rodata段存放隻讀資料(如:字元串常量)
Linux系統程式設計——程式(一)

二、程序的“生老病死”

  • 程序從“誕生”到“被回收”的一系列過程狀态轉換圖,如下圖所示
一般流程為:
  1. 父程序調用fork函數,生成子程序(使用fork産生的子程序與父程序一模一樣,并且子程序會從fork傳回值後的下一條邏輯語句開始執行)
  2. 子程序運作結束,執行exit退出
  3. 父程序使用wait或者waitpid回收子程序的資源
Linux系統程式設計——程式(一)
Linux系統程式設計——程式(一)

三、程序相關函數

1、子程序的建立
  • pid_t   fork(void);
2、程序的退出
  • void exit(int status);//清空I/O緩沖區之後,才退出程序 ,在多程序裡面,程序正常退出需要用exit(0)
  • void _exit(int status);//直接結束程序,不做清理的操作,直接進入到核心。
  • return 0;// return是c語言裡面的一個關鍵字。如果是在調用函數的時候,是出棧的處理。如果是在main函數裡面,是結束程序
3、子程序資源的回收(如果子程序資源沒有被回收,則會變成僵屍程序,占用系統資源)
  • pid_t wait(int *stat_loc);//阻塞
  • pid_t waitpid(pid_t pid, int *stat_loc, int options);//可阻塞 或者 無阻塞
4、在一個程序中調用另外一個程序(system調用其他程序是通過shell調用其他程序,本程式程序與被調用的程序之間沒有關系。)
  • int system(const char *command);
  • 如:system("ls -l")、system("./main")

5、子程序中運作其他程式(程式的替換,覆寫原有代碼)

其中:execl 中的l 與execv 中的v 的含義

    l: list  清單,把參數一一清單寫在參數裡面,寫完之後,需要加一個NULL。

    v: vector 向量、數組,把參數寫進去。

  • int execl(const char *path, const char *arg, ... , );
  • int execlp(const char *file, const char *arg, ... , );
  • int execle(const char *path, const char *arg, ... , );
  • int execv(const char *path, char *const argv[]);
  • int execvp(const char *file, char *const argv[]);
  • int execvpe(const char *file, char *const argv[], char *const envp[]);

繼續閱讀