Linux程序執行緒學習筆記 程序建立

2022-02-12 12:37:21 字數 2061 閱讀 6893

linux程序執行緒學習筆記:程序建立

周銀輝各位同學,轉換下思維,這裡說的是「程序」, 不是「執行緒」,ok,我們開始

「程序」二字似乎總有那麼些「只可意會不可言傳」的韻味,維基百科是這樣來解釋的:

也有朋友如此來闡述,

乙個可以執行的程式; 

和該程序相關聯的全部資料(包括變數,記憶體空間,緩衝區等等); 

程式的執行上下文(execution context)

我更希望將這些簡化一下(或許不太準確):指令和執行指令所需的環境,指令可以理解成「**」,環境可以理解成「上下文」 

系統用乙個叫做「程序表」的東西來維護中系統中的程序,程序表中的乙個條目維護著儲存著乙個程序的相關資訊,比如程序號,程序狀態,暫存器值等等...

當分配給程序a的「時間片」使用完時,cpu會進行上下文切換以便執行其他程序,比如程序b,這裡所謂的「上下文切換」,主要就是在操作那個「程序表」,其將程序a的相關資訊(上下文)儲存到其對應的程序表項中, 與之相反,其會從對應於程序b的程序表項中讀取相關資訊並執行之。

那麼,如果程序a新建了乙個程序c呢?教程表會多這樣乙個表項,並且該表項擁有乙個唯一的id,也就是程序號(pid),程序表項的其他值大部分與程序a的相同,具體說來,就是c和a共享**段,並且c將a的資料空間,堆疊等複製乙份 ,然後從a建立c的地方開始執行。

a和c的相似度極大,除了以下方面(來自這裡: ):

從**角度來看,建立乙個新程序的函式宣告如下:

pid_t fork(

void

);其包含在 unistd.h 標頭檔案中,其中pid_t是表示「type of process id」的32位整數, 至於函式的返回值,取決於在哪個程序中來檢測該值,如果是在新建立的程序中,其為0;如果是在父程序中(建立新程序的程序),其為新建立的程序的id; 如果建立失敗,則返回負值。

我們看下面的**:

#include 

<

stdio.h

>

#include 

<

unistd.h

>

intmain ()

else

if(id==0

) else

return0;

}為了方便理解,我在上面使用了getpid函式,其返回當前程序的id。

程式輸出為:hi,

i'm in old process

,the return value is 

5429hi,

i'm in new process

,my id is 

5429

另外,看到不少資料上說「fork函式是少數返回兩個值的函式」,我不贊成該說法,我猜想,其之所以看上去有著不同的值,是系統建立新程序並複製父程序相關資源時,故意根據建立狀態放入了不同的值。 

fork函式失敗的原因主要是沒有足夠的資源來進行建立或者程序表滿,如果是非root許可權的賬戶,則可能被管理員設定了最大程序數。乙個使用者所能建立的最大程序數限制是很重要的,否則一句**就可能把主機搞當機:for(;;) fork(); 

再看下面的**:

#include 

<

stdio.h

>

#include 

<

unistd.h

>

intmain ()

輸出如下:

1the counter value 

1之所以會這樣,畫個圖就明白了:

並且,新程序得到的是父程序的副本,所以,父子程序counter變數不會相互影響。 

再來乙個demo:

#include 

<

stdio.h

>

#include 

<

unistd.h

>

intmain ()

好奇怪是吧?情況是這樣的:

哈,大概就這麼多,至於如何建立乙個新程序以執行乙個新程式,稍候我會談exec函式,它們兩者相結合就可以了~ 

Linux程序執行緒學習筆記

所以,要執行乙個新程式,需要最基本的兩步 1,建立乙個可執行程式的環境,也就是程序。2,將環境中的內容替換成你所希望的,也就是用你希望執行的可執行檔案去覆蓋新程序中的原有映像,並從該可執行檔案的起始處開始執行。exec是一族函式的簡稱,包含在中它們作用都一樣,用乙個可執行檔案覆蓋程序的現有映像,並轉...

linux 程序學習筆記 程序訊號sigal

訊號 或軟中斷 是在軟體層次上對中斷的乙個模擬,其執行在 使用者空間 乙個程序對另外乙個或幾個程序通過傳送訊號來實現非同步通訊。當接收程序接收到訊號後,其可以註冊一下處理函式來說對這些訊號進行處理 也可以選擇忽略該訊號或者採用系統預設的處理方式 我看可以通過 kill l 命令來檢視系統支援的訊號,...

Linux學習筆記9 程序 程序概述

程序 process 是乙個程式一次執行的過程,而並非程式本身。程序是動態的,是乙個執行的程式,程式是靜態的。它是一些儲存在磁碟上的指令的有序集合。程序包含了程序的動態建立 排程和消亡的過程。從系統的角度,通過控制塊 pcb,process control block 來描述程序pcb包含了程序的描...