程序及程序控制

2021-09-24 21:35:17 字數 2154 閱讀 8134

學習程序之前,先了解一下程式:所謂程式就是指編譯好的二進位制檔案,在磁碟上,不占用系統資源(cpu、記憶體.....)

而程序是與作業系統相關,是指在記憶體中執行起來的程式,占用一些系統資源,每當乙個程式執行,就相應產生乙個程序。程序的一些相關資訊被放在乙個叫程序控制塊的資料結構中,稱之為pcb。

linux下的pcb是task_struct,其中的一些成員:

指在作業系統中用來指定作業系統執行環境的一些引數,相當於乙個指標。可以用

getenv函式:獲取環境變數值

char *getenv(const char *name); 成功:返回環境變數的值;失敗:null (name不存在)

setenv函式:設定環境變數的值

int setenv(const char *name, const char *value, int overwrite);

返回值:成功:0;失敗:-1

引數overwrite取值: 1:覆蓋原環境變數 0:不覆蓋。

unsetenv函式:刪除環境變數name的定義

int unsetenv(const char *name); 成功:0;失敗:-1

其中程序等待最主要的原因就是為了防止殭屍程序的危害。

殭屍程序產生原因:在建立乙個程序的時候,1.fork( ),會返回兩次,一次進入父程序(返回值=子程序pid),一次進入子程序(返回值=0),2.在fork()的呼叫處,整個父程序空間會原模原樣地複製到子程序中,包括指令,變數值,程式呼叫棧,環境變數,緩衝區,等等。當子程序想要退出的時候,若父程序沒有wait( )或waitpid( )獲取子程序的退出碼,子程序的狀態會變為z狀態(殭屍程序)。設定成殭屍程序的原因是維護子程序的資訊,以便父程序在以後的某個時間獲取。而當父程序終止,有子程序是殭屍狀態的,那麼殭屍程序的父程序id就變為1(init程序)。

殭屍程序的危害:若一直等待父程序獲取它的退出原因,而父程序一直沒有獲取,那麼這個子程序將一直以殭屍狀態一直存在;系統還要一直維護子程序的pcb(因為其中儲存著程序的退出狀態等資訊);若有多個殭屍程序,還會占用記憶體,造成資源的浪費;記憶體洩漏。應該用wait/waitpid來獲取其退出狀態,避免產生殭屍程序。

linux下檢視程序的命令:檢視程序:ps      實時更新:top         查詢殭屍程序:ps  -aux|grep  z        殺死乙個程序:kill  -9   pid

1 #include 2 #include 3 #include 4 

5 int main()

6 12 if(i == 0)

13

17 else

18

22 23 }

可以看到有乙個殭屍程序: 

1.可以用wait阻塞等待任意子程序退出,返回其pid,

2.也可以用waitpid等,-1為等待任意程序,也可以指定程序的pid,wnohang設定非阻塞等,0時,阻塞等待。

父程序先於子程序退出,而子程序仍然執行,子程序就是孤兒。程序來看下面子程序等待600s時,父程序非阻塞witpid,所以可以exit(0)結束。子程序就變成了孤兒程序。

可以看到子程序pid

來看一下子程序的詳細資訊

因為15077的父程序已經退出,而作業系統會將孤兒程序通過init(pid==1)程序來管理,等程序結束後,**資源。

Linux程序控制 程序建立

linux下建立程序的方式有三種,通過fork vfork clone系統呼叫實現程序的建立 1.fork fork函式用於建立乙個新的程序,其建立的程序和當前程序為父關係,子程序建立自己的task struct 之後初始化子程序的互斥變數 cpu定時器 自旋鎖 掛起訊號 程序資料結構等並且設定程序...

Linux程序控制 程序替換

使用fork建立的程序和父程序執行的相同的程式 執行不同的 分支 子程序需要執行其他程式需要通過exec函式進行程序替換執行另乙個程式。替換函式 exec函式總共有六個 int execl const char path,const char arg,int execlp const char fi...

程序管理 八 程序控制

在作業系統中,通常把程序控制用程式段做成原語。為了在併發執行過程中執行程序控制任務時候,減少系統的開銷和複雜度 建立方式 特點由系統程式模組統一建立 關係是平等 它們之間一般不存在資源繼承關係 由父程序建立 程序之間則存在隸屬關係 子程序可繼承父程序資源 建立方式總結 1.無論是哪一種方式建立程序,...