Linux 程序控制

2021-10-02 23:02:03 字數 1582 閱讀 9852

pid_t fork(void)

流程:clone()

1、建立pcb;

2、複製資訊;

3、記憶體資料發生改變的時候為子程序重新開闢空間,拷貝資料(寫時拷貝技術)

寫時拷貝技術:子程序建立出來後,與父程序對映訪問同一跨物理記憶體,當物理記憶體中資料即將發生改變時,重新位子程序開闢物理記憶體,拷貝資料過去;(為了避免直接給子程序開闢空間,拷貝資料,而子程序不使用,降低了程序建立效率,造成記憶體冗餘資料)

pid_t vfork(void)

建立乙個子程序,父子程序共用同乙個虛擬位址空間共用同一塊虛擬位址空間,使用同乙個棧,則若父子程序同時執行就會造成呼叫棧混亂;因此讓子程序先執行,直到子程序退出或者程式替換後有了自己的位址空間(在原有的位址空間中子講程的呼叫就都出棧了)

因此父程序呼叫vfork建立子程序,vfork的呼叫,並不會立即返回,會被阻塞,直到子程序exit()退出/進行了程式替換,重新建立了自己的虛擬位址空間之後,父程序才會vfork返回進行執行

但是要注意,vfork建立的子程序,不能在main函式中使用return退出,因為子程序使用』return退出的時候釋放了所有資源,父程序執行的時候資源是錯誤的

1、程序退出的場景:

2、程序的返回值,只用了乙個位元組來儲存

3、在linux系統中erron.h這個標頭檔案中有兩個全域性變數:

4、程序退出方法:

5、 緩衝區,\n,重新整理緩衝區的作用

1、 概念:

2、 如何等待:

3、阻塞、非阻塞

6、其他

status&0x7f :獲取程式異常退出訊號值

(status >>8)& 0xff :獲取程式的退出返回值

wifexited(status):判斷程序是否正常退出,正常則退出則返回真

wexitstatus(status):獲取退出子程序的返回值

core dump,核心轉儲其實就指的是程式異常退出時,將退出前的程式執行資訊儲存下來(預設是關閉的:程式中有很多敏感資料,有隱私洩露風險;儲存執行資料需要占用磁碟空間)

exec函式族

有沒有p的區別:程式名稱是否需要帶路徑

有沒有e的區別:是否自定義環境變數

l和v的區別:程式執行引數的賦予方式不同

fflush(stdout); 手動重新整理緩衝區

fgets(buf,1024,stdin);從標準輸入讀取資料

buf[strlen(buf)-1]=』\0』;將後的換行符修改為字串結束標誌

execvp(ar**[0], ar**);子程序進行程式替換

waitpid(pid, null, 0);阻塞等待子程序命令執行完畢

不能直接對shell進行程式替換,因為替換後就沒有shell

linux 程序控制

什麼是程序 每乙個程序在系統中都有唯一的id標示它,此id為程序標示符 程序標示符的型別 pit t,其實是乙個無符號整形 乙個程序標示符對應唯一的乙個程序,多個程序標示符可以對應同乙個程式 程序和程式的區別 程式 可執行的二進位制 檔案,這種檔案載入到記憶體中執行就得到了乙個程序 程序 同乙個程式...

Linux程序控制

linux程序控制 獲取pid include include pid t getpdi void 獲取本程序id pdi t getppid vodi 獲取父程序id,及獲取建立子程序的程序id 程序建立 include pid t fork void 建立子程序 呼叫一次返回兩次值 1.父程序中...

linux程序控制

linux程序控制 編寫命令直譯器 一 背景 之前在 計算機作業系統 這本書中已經多次接觸了程序這一概念,而程序在作業系統中具體是做什麼的呢?卻沒有實際的與程序發生過互動,因此也就沒有實際的感受。對於我來說程序僅僅停留在概念的層面上 程序是程式執行時的記憶體空間和設定或者說程序就是程式的進行時。沒有...