實驗三 程序與執行緒

2021-06-21 14:56:16 字數 3186 閱讀 1272

一、實驗名稱:實驗三 程序與執行緒

二、實驗日期:2014/3/13

三、實驗目的:

1.  linux程序

2.  簡單的程序同步

四、實驗的步驟和方法

實驗1 linux程序家族樹

檔名3-1-1.c:看程式寫結果。

要求:

增加1個fork()、2個fork()、多個fork()的結果會怎樣?並說明原因,找出規律。

增加1個fork()

3-1-1-1.c

增加2個fork()

3-1-1-2.c

增加n個fork()結果會有2n個程序。

在fork()語句後新增如下2條語句,結果將如何?

printf(「get the child pid: %d\n」,getpid());

printf(「get the parent pid: %d\n」,getppid());

3-1-2.c

init程序

init程序是系統所有程序的起點,核心在完成核心引導以後,即在本執行緒(程序)空間內載入init程式,它的程序號是1。init程序是所有程序的發起者和控制者。因為在任何基於unix的系統(比如 linux)中,它都是第乙個執行的程序,所以init程序的編號(process id,pid)永遠是1。如果init出現了問題,系統的其餘部分也就隨之不可用。

init程序有兩個作用:

① 扮演終結父程序的角色。因為init程序永遠不會被終止,所以系統總是可以確信它的存在,並在必要的時候以它為參照。如果某個程序在它衍生出來的全部子程序結束之前被終止,就會出現必須以init為參照的情況。此時那些失去了父程序的子程序都會以init作為它們的父程序。

快速執行一下「ps –af」或者top或者gnome-system-monitor命令,可以列出當前執行的程序來。

② 在進入某個特定的執行級別(runlevel)時執行相應的程式,以此對各種執行級別進行管理。

實驗2 父子程序同步實驗

檔名3-2.c:實現子程序先輸出」child proc」,父程序後輸出」 parent proc」。

要求:

請總結實現簡單的父子程序同步的一般方法。

3-2.c

linux中父子程序同步相關系統呼叫

1)程序終止

void exit(stat)

主要任務:自我終止,將程序狀態變為」僵死」狀態,等待父程序用wait系統呼叫來收集。一般引數可設為0,即exit(0)。

exit()

在執行該函式時,程序會檢查檔案開啟情況,清理i/o快取,如果快取中有資料,它們就會寫入相應的檔案,這樣就防止了檔案資料的丟失!然後終止程序。

_exit()

在執行該函式時,並不清理標準輸入輸出快取,而是直接清除記憶體空間,當然也就把檔案快取中尚未寫入檔案的資料給銷毀了。由此可見,使用exit()函式更加安全。

父程序等待子程序終止

pid_t wait([int*stat_addr]0)

一般引數可設為0,即wait(0)

實驗3 子程序映像的重新裝入

建立一程序child.c,功能是輸出」i am a child.」,再建立乙個父程序3-3.c載入該子程序 。

要求:

理解子程序映像的重新裝入。

linux中子程序映像的重新裝入

linux提供了一組系統呼叫exec函式,主要功能是將指定的可執行檔案載入到指定的程序映像中,覆蓋該程序映像中原有的程式。

此類系統呼叫有execl()、execle()、execlp()、execv()、execve()、execvp()

本課只介紹execl()和execv()

execl(「路徑名/檔名」,0)

execv(file, argv)

引數定義:

char *file 指向檔案全名(路徑名/檔名)的指標;

char *argv[n]指向命令及引數的指標。

載入成功則直接執行,不返回;不成功返回-1

child.c

建立乙個child.c原始檔並編譯成child執行檔案

3-3.c

實驗4 子程序映像的重新裝入

建立一程序child1.c,再建立乙個父程序3-4.c載入該子程序。

要求:

1.  理解子程序映像的重新裝入。

2.  掌握exec類函式的用法及功能。

3-4.c:改寫子程序的功能為呼叫鍵盤命令ls –l,已知該鍵盤命令的路徑與檔名為:/bin/ls

在子程序分支中,用execl載入自己的程式後,新增一條語句如printf(「ok!\n」);結果將如何?

child1.c

3-4.c

五、實驗結果或結論

Linux之路 程序與執行緒(實驗)

實驗1.建立倆個程序,讓子程序讀取乙個檔案,父程序等待子程序讀完檔案後繼續執行 include include include include int main else printf 開啟檔案成敗 exit 3 else return 0 實驗2,執行緒共享程序中的資料,在程序中直接引用並輸出該資...

執行緒與程序 執行緒三把鎖

學習三把鎖時候我們需要先知道為什麼要有三把鎖 全域性資源 counter 被搶占的情況,問題產生的原因就是沒有控制多個執行緒對同一資源的訪問,對資料造成破壞,使得執行緒執行的結果不可預期。這種現象稱為 執行緒不安全 在開發過程中我們必須要避免這種情況,那怎麼避免?這就用到了我們在綜述中提到的互斥鎖了...

C 關於程序與執行緒 三

一 建立多執行緒應用程式 執行緒,也被稱為輕量程序,指執行中程式的排程單位。目前大部分平台都支援多執行緒,允許程式中存在多個執行緒。在windows作業系統的任務管理器中就可以檢視執行緒,把選擇列對話方塊的執行緒計數選上即能顯示每個程序的執行緒數。在本節的例項中,建立了乙個最簡單的多執行緒應用程式。...