2. 程序控制
在提出這個問題的時候,我想了一下,大概就是核心執行的乙個程式(錯誤回答)吧。但是這麼說,連我自己下次看都不明白在說什麼。於是我查了一下,它代表著cpu所能處理的單個任務,及執行例項。
在面向程序設計的系統(如早期 unix,linux 2.4及更早版本中),程序是程式的基本執行實體;先看乙個簡單的例子。在面向執行緒設計的系統(當代多數作業系統、linux 2.6及更新版本中),程序本身不是基本執行單位,而是執行緒的容器
下圖演示的是乙個最為普遍的乙個c程式的啟動過程,main 函式呼叫使用者函式,返回值後退出。
核心使程式執行的唯一方法是呼叫乙個exec
函式
啟動例程從核心獲取命令列引數和環境變數值,為呼叫main
函式做好準備
呼叫返回
呼叫exit
函式或者執行return
語句
exit
函式呼叫終止處理程式
後,再呼叫_exit
或者_exit
立即進入核心
程序控制原語:建立新程序、執行程式、程序終止
程序標識:每個程序都有乙個非負整數表示的唯一程序 id,可復用(延遲復用演算法)
建立新程序
乙個現有的程序可以呼叫函式fork
建立新程序。
例如
這個程式建立乙個程序,在子程序裡對變數加 1,父程序睡眠 2s,主動進入阻塞。啟動終止流程如下#include
#include
int globvar =6;
intmain
(void
)else
if(pid ==0)
else
printf
("pid = %ld, glob = %d, var = %d\n",(
long
)getpid()
, globvar, var)
;exit(0);}
main 函式這次呼叫的是 fork 函式
fork 函式複製了資料段、堆、棧,但是父子程序共享正文段
但是事實上很多實現並不執行乙個父程序資料段、堆、棧的完全副本。使用寫時複製(copy-on-write,cow)技術,即父子程序共享資料段、堆、棧(唯讀),如果父子程序中的任乙個試圖修改這些區域,核心只為修改區域的那塊記憶體製作乙個副本。
父程序阻塞
fork 之後,父子程序各自執行程式,wait 可以使父程序阻塞等待子程序先執行。
當呼叫 wait 之後#include pid_t wait(int *statloc);
/* * pid == -1 等待任一子程序
* pid > 0 等待程序 id 於 pid 相等的子程序
* pid == 0 等待組 id 等於呼叫程序組 id 的任一子程序
* pid < -1 等待組 id 等於 pid 絕對值的任一子程序
*/pid_t waitpid(pid_t pid, int *statloc, int options);
執行程式
當程序呼叫 exec 程式族,該程序執行的程式完全替換為新的程式(繼承?)。
終止程式
exit
**函式 system **
system 在其實現中呼叫了 fork、exec、waitpid,用於總結程序原語的使用。
system 函式用於在程式中執行乙個命令。
system 建立乙個子程序
在子程序中執行輸入的命令列程式
在父程序中等待程式執行完畢
8-13-system.c 檔案:
8-13-system-test.c 測試檔案:#include
#include
#include
intsystem
(const
char
*cmdstring)if(
(pid =
fork()
)<0)
else
if(pid ==0)
else}}
return
(status)
;}
編譯:#include
"apue.h"
#include
intmain
(int argc,
char
const
*ar**)
pr_exit
(status);if
((status =
system
("nosuchcommand"))
<0)
pr_exit
(status);if
((status =
system
("who; exit 44"))
<0)
pr_exit
(status)
;return0;
}
> gcc 8-13-system.c 8-13-system-test.c -g -o2 -o system.out -lapue
執行:
> ~/test$ ./system.out
2023年 04月 15日 星期三 00:31:57 cst
normal termination, exit status = 0
sh: 1: nosuchcommand: not found
normal termination, exit status = 127
renz :0 2020-04-15 05:52 (:0)
normal termination, exit status = 44
UNIX環境高階程式設計學習筆記
include include include include int main int argc,char argv err sys can t open s argv 1 while dirp readdir dp null printf s n dirp d name closedir dp ...
Unix環境高階程式設計學習筆記 二
三種主要的標準 iso c ieee posix single unix specification xsi 一層一層遞增,ieee posix 是iso c的超集。xsi 是posix的超集。要想提高軟體的可移植性,就必須有限制 編譯時限制 因為某些限制是固定的,則可以在標頭檔案中定義。執行時限制...
UNIX環境高階程式設計學習筆記(一)UNIX基礎知識
1.作業系統可被定義為一種軟體,它控制計算機硬體資源,提供程式執行環境。通常稱為核心 kernel 2.核心的介面被稱為系統呼叫。公共函式庫建在系統呼叫介面之上,應用程式既可使用公共函式庫,也可使用系統呼叫。shell是乙個特殊的應用程式,為執行其他應用程式提供乙個介面.3.unix檔案系統是目錄和...