UNIX基礎知識之程式和程序

2021-09-08 17:03:59 字數 2637 閱讀 2383

程式(program)是存放在磁碟上、處於某個目錄中的乙個可執行檔案。使用6個exec函式中的乙個由核心將程式讀入儲存器,並使其執行。

程式的執行例項被稱為程序(process)。某些作業系統使用任務(task)表示正在執行的程式。

unix系統確保每個程序都有乙個唯一的數字識別符號,稱為程序id(process id)。程序id總是乙個非負整數。

程式清單1-4 列印程序id

[root@localhost unix_env_advance_prog]# cat prog1-4

.c#include

"apue.h

"int

main(

void

)

編譯後執行:

[root@localhost unix_env_advance_prog]# ./prog1-4

hello world

from process id 23987

[root@localhost unix_env_advance_prog]# ./prog1-4

hello world

from process id 23988

此程式執行時,它呼叫函式getpid得到其程序id。

有三個用於程序控制的主要函式:fork、exec和waitpid。(exec有六種變體,但經常把它們統稱為exec函式。)

程式清單1-5 從標準輸入讀入命令並執行(類shell程式的簡化實現):

[root@localhost unix_env_advance_prog]# cat prog1-5

.c#include

"apue.h

"#include

intmain(

void

)

else

if(pid == 0) /*

child

*/

/*parent

*/if((pid = waitpid(pid, &status, 0)) < 0

) err_sys(

"waitpid error");

printf(

"%% ");

}exit(0);

}

編譯後執行:

[root@localhost unix_env_advance_prog]# ./prog1-5

%lsapue.h makefile prog1-1.c prog1-2.c prog1-3.c prog1-4.c prog1-5

.cerror.c prog1-1 prog1-2 prog1-3 prog1-4 prog1-5

%

用標準i/o函式fgets從標準輸入一次讀一行,當鍵入檔案結束符(通常是ctrl+d)作為行的第1個字元時,fgets返回乙個null指標,於是終止迴圈,程序也就終止。

因為fgets返回的每一行都以換行符終止,後隨乙個null位元組,故用標準c函式strlen計算此字串的長度,然後用乙個null位元組替換換行符。這樣做是因為execlp函式要求引數以null而不是以換行符結束。

呼叫fork建立乙個新程序。新程序是呼叫程序的複製品,我們稱呼叫程序為父程序,新建立的程序為子程序。fork向父程序返回新子程序的程序id(非負),對子程序則返回0。因為fork建立乙個新程序,所以說它被呼叫一次(由父程序),但返回兩次(分別在父程序及子程序中)。

在子程序中,呼叫execlp以執行從標準輸入讀入的命令。這就用新的程式檔案替換了子程序原先執行的程式檔案。fork和跟隨其後的exec兩者的組合是某些作業系統所稱道產生(spawn)乙個新程序。在unix系統中,這兩個部分相互分隔,構成兩個函式。

子程序呼叫execlp執行新程式檔案,而父程序希望等待子程序終止,這一要求由呼叫waitpid實現,其引數指定要等待的程序(在這裡,pid引數是子程序id)。waitpid函式返回子程序的終止狀態(status變數)。如果需要,可以使用status變數的值準確地判定子程序是因何終止的。

小知識:^d表示乙個控制字元。控制字元是特殊字元,其形成方法是:在鍵盤上按下控制鍵——通常被標記為control或ctrl,同時按另乙個鍵。control-d或^d是預設的檔案結束符。

通常,乙個程序只有乙個控制線程(thread),同一時刻只執行一組機器指令。對於某些問題,如果不同部分各使用乙個控制線程,那麼整個問題解決起來就容易很多。另外,多個控制線程也能充分利用多處理器系統的並行性。

在乙個程序內的所有執行緒共享同一位址空間、檔案描述符、棧以及與程序相關的屬性。因為它們能訪問同一儲存區,所以各執行緒在訪問共享資料時需要採取同步措施以避免不一致性。

與程序相同,執行緒也用id標識。但是,執行緒id只在它所屬程序內起作用。乙個程序中的執行緒id在另乙個程序中並無意義。當在乙個程序中對多個執行緒進行操作時,我們用執行緒id引用相應的執行緒。

控制線程的函式與控制程序的函式類似,但另有一套。在程序模型建立很久之後,執行緒模型才被引入到unix系統中,這兩個模型之間存在複雜的相互作用。

本篇博文內容摘自《unix環境高階程式設計》(第二版),僅作個人學習記錄所用。關於本書可參考:

UNIX基礎知識之訊號

本篇博文內容摘自 unix環境高階程式設計 第二版 僅作個人學習記錄所用。關於本書可參考 訊號 signal 是通知程序已發生某種情況的一種技術。例如,若某一程序執行除法操作,其除數為0,則將名為sigfpe 浮點異常 的訊號傳送給該程序。程序如果處理訊號有三種選擇 2 按系統預設方式處理。對於除以...

UNIX基礎知識之輸入和輸出

檔案描述符 file descriptor 通常是乙個小的非負整數,核心用它標識乙個特定程序正在訪問的檔案。當核心開啟乙個已有檔案或建立乙個新檔案時,它返回乙個檔案描述符。在讀 寫檔案時,就可以使用它。按慣例,每當執行乙個新程式時,所有的shell都會為其開啟三個檔案描述符 標準輸入 standar...

UNIX基礎知識之輸入和輸出

檔案描述符 file descriptor 通常是乙個小的非負整數,核心用它標識乙個特定程序正在訪問的檔案。當核心開啟乙個已有檔案或建立乙個新檔案時,它返回乙個檔案描述符。在讀 寫檔案時,就可以使用它。按慣例,每當執行乙個新程式時,所有的shell都會為其開啟三個檔案描述符 標準輸入 standar...