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包含了程序的描...