UNIX環境高階程式設計學習筆記 程序

2021-10-04 22:26:33 字數 3373 閱讀 8056

2. 程序控制

在提出這個問題的時候,我想了一下,大概就是核心執行的乙個程式(錯誤回答)吧。但是這麼說,連我自己下次看都不明白在說什麼。於是我查了一下,它代表著cpu所能處理的單個任務,及執行例項。

在面向程序設計的系統(如早期 unix,linux 2.4及更早版本中),程序是程式的基本執行實體;

在面向執行緒設計的系統(當代多數作業系統、linux 2.6及更新版本中),程序本身不是基本執行單位,而是執行緒的容器

先看乙個簡單的例子。

下圖演示的是乙個最為普遍的乙個c程式的啟動過程,main 函式呼叫使用者函式,返回值後退出。

核心使程式執行的唯一方法是呼叫乙個exec函式

啟動例程從核心獲取命令列引數環境變數值,為呼叫main函式做好準備

呼叫返回

呼叫exit函式或者執行return語句

exit函式呼叫終止處理程式後,再呼叫_exit或者_exit立即進入核心

程序控制原語:建立新程序、執行程式、程序終止

程序標識:每個程序都有乙個非負整數表示的唯一程序 id,可復用(延遲復用演算法)

建立新程序

乙個現有的程序可以呼叫函式fork建立新程序。

例如

#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);}

這個程式建立乙個程序,在子程序裡對變數加 1,父程序睡眠 2s,主動進入阻塞。啟動終止流程如下

main 函式這次呼叫的是 fork 函式

fork 函式複製了資料段、堆、棧,但是父子程序共享正文段

但是事實上很多實現並不執行乙個父程序資料段、堆、棧的完全副本。使用寫時複製(copy-on-write,cow)技術,即父子程序共享資料段、堆、棧(唯讀),如果父子程序中的任乙個試圖修改這些區域,核心只為修改區域的那塊記憶體製作乙個副本。

父程序阻塞

fork 之後,父子程序各自執行程式,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);

當呼叫 wait 之後

執行程式

當程序呼叫 exec 程式族,該程序執行的程式完全替換為新的程式(繼承?)。

終止程式

exit

**函式 system **

system 在其實現中呼叫了 fork、exec、waitpid,用於總結程序原語的使用。

system 函式用於在程式中執行乙個命令。

system 建立乙個子程序

在子程序中執行輸入的命令列程式

在父程序中等待程式執行完畢

8-13-system.c 檔案:

#include

#include

#include

intsystem

(const

char

*cmdstring)if(

(pid =

fork()

)<0)

else

if(pid ==0)

else}}

return

(status)

;}

8-13-system-test.c 測試檔案:

#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檔案系統是目錄和...