目錄
一、什麼是程序
二、程序的“生老病死”
三、程序相關函數
一、什麼是程序
- 程序是程式執行的動态過程
- 程序是資源管理的最小機關(線程是系統排程的最小機關)
- 在linux中,我們可以通過 file 檔案名 得知一個檔案的檔案類型,以一個可執行程式為例,如下圖所示
- 由上面可以得知,大多數的可執行程式的格式為ELF格式。那麼一個可執行程式,是如何被linux運作起來的呢?如下圖所示
當ELF格式的可執行程式被執行的時候,程式被加載到記憶體中執行,此時核心産生了一個名為task_struct{}的結構體來表示與管理這個程序。
其中:
- .text 段存放代碼,隻讀并且共享,這段記憶體在程式運作期間不會被釋放
- .data段存放已經初始化的全局變量和已經初始化的static變量,可讀可寫,這段記憶體在程式運作期間一直存在。
- .bss段存放未初始化的全局變量和未初始化的static變量,可讀可寫,這段記憶體在程式運作期間一直存在。
- .rodata段存放隻讀資料(如:字元串常量)
二、程序的“生老病死”
- 程序從“誕生”到“被回收”的一系列過程狀态轉換圖,如下圖所示
一般流程為:
- 父程序調用fork函數,生成子程序(使用fork産生的子程序與父程序一模一樣,并且子程序會從fork傳回值後的下一條邏輯語句開始執行)
- 子程序運作結束,執行exit退出
- 父程序使用wait或者waitpid回收子程序的資源
三、程序相關函數
1、子程序的建立2、程序的退出
- pid_t fork(void);
3、子程序資源的回收(如果子程序資源沒有被回收,則會變成僵屍程序,占用系統資源)
- void exit(int status);//清空I/O緩沖區之後,才退出程序 ,在多程序裡面,程序正常退出需要用exit(0)
- void _exit(int status);//直接結束程序,不做清理的操作,直接進入到核心。
- return 0;// return是c語言裡面的一個關鍵字。如果是在調用函數的時候,是出棧的處理。如果是在main函數裡面,是結束程序
4、在一個程序中調用另外一個程序(system調用其他程序是通過shell調用其他程序,本程式程序與被調用的程序之間沒有關系。)
- pid_t wait(int *stat_loc);//阻塞
- pid_t waitpid(pid_t pid, int *stat_loc, int options);//可阻塞 或者 無阻塞
- 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[]);