程序控制2 幾個簡單API

2021-08-05 23:31:18 字數 2565 閱讀 5928

程序建立fork()

fork()函式可以用來建立乙個子程序,它被呼叫一次,卻返回兩次,它可能有三種不同的返回值:在父程序中,fork返回新建立的子程序的pid;在子程序中,fork返回0;如果出現錯誤,fork返回乙個負值。

通過以下**可以驗證:

pid_t pid = fork();

if (pid == -1)

if (pid > 0) // 父程序

else

if (pid == 0) // 子程序

while (1);

用一條指令ps -ef | grep a.out 可以捕捉到兩個程序,id分別為 7005 和7006,這兩個分別是父程序和新建的子程序。所以可見在fork()返回0時確實建立了子程序。

當fork()順利完成任務時,就會存在兩個程序,每個程序都從fork()返回處開始繼續執行。兩個程序執行相同的**(text)段,但是有各自的堆疊(stack)段、資料(data)段以及堆(heap)。子程序的stack、data、heap segments是從父程序拷貝過來的。父子程序是共享**段的,所以從fork()之後父子程序是一起進行的,哪乙個程序先執行(scheduled to use the cpu)不確定。

通過下面的**可以看出:

pid_t pid = fork();

count++;

printf ("count = %d\n", count);

可以發現count被列印了兩次,且值都為一,所以父子程序是一起進行的,各有自己的資料段和堆,棧。

vfork()

vfork() 的用法和fork()比較類似,但也有幾點需要區別開來:vfork 的子程序必須要顯示呼叫 exit(); vfork 子程序和父程序共享資料段;vfork 的子程序先於父程序執行,子程序執行完,cpu才能排程到父程序

int count = 0;

pid_t pid = vfork();

if (pid < 0)

count++;

if (pid > 0) // 父程序

else

if (pid == 0) // 子程序

子程序在使用exit()才能顯示呼叫,在上面的**中,count在執行後或許還是兩個1,但我們如果把count改為全域性變數,結果就會有所不同了。

測試後發現,count加了兩次,所以可以發現,是子程序先執行,然後再執行父程序的,同時也可以發現他們是共用乙個資料段的。

exec函式族

exec函式族中函式是啟動乙個新程式,替換原有的程序,因此程序的pid不會改變。

execl()

#include 

int execl(const char * path, const char* arg1,...)

path是可執行程式的路徑,後面則是相關的引數,引數可以有若干但必須以空指標null結尾。

通過以下操作可以操作乙個可執行程式file。

int ret = execl("/mnt/hgfs/share/0809/file", "./file", null);
execlp()

execlp()函式沒有多大說法只是path不含路徑,將從path環境變數中查詢該程式。我們可以將可執行檔案複製乙份到bin目錄下。

int ret = execlp("file1", "file1", null);
比如複製file1到bin目錄下,不許輸入絕對路徑即可實現同樣功能。

execv()

#include 

int execv(const

char * path, const

char *argv)

execv就更沒什麼好說的了,只是將原先後面的引數放進了乙個字元陣列,其他並無何區別。

寫乙個案例:

char *a = ;

int ret = execv("/bin/ps", a);

再來講乙個功能強大的system()

system()

#include 

int system(const

char* string)

呼叫fork產生子程序,由子程序來呼叫 /bin/sh -c string來執行引數string所代表的命令

system功能十分強大,幾乎就是直接向終端輸出指令,也不需要加更多的引數。

printf ("hellp world\n");

sleep(1);

// 在內部fork()乙個子程序,呼叫 /bin/sh -c string來執行

system("ps -ef | grep a.out");

可以說system 太方便了,似乎前面的都白學了,但對exec函式族的函式還是要有些了解的。

程序控制(2)

在程序控制 1 中,介紹了建立子程序fork和vfork函式,其實在建立乙個程序之後,子程序往往會呼叫乙個exec函式去執行另乙個程式。當呼叫乙個exec函式之後,該程序執行的程式完全替換為新程式,而新程式從main函式開始執行。exec函式並不建立新的程序,前後程序id不變,只是用磁碟上的乙個新程...

linux 程序控制2

在程序控制的章節我們講解了我們的程序建立,這章節對程序控制進行補充,在我們建立乙個程序之後我們避免不了我們去終止我們的程序。終止場景 終止方式 include void exit int status include void exit int status 雖然兩個函式都是可以讓程序終止的,但是兩...

程序控制相關的幾個函式

通常,建立新的程序,都是為了立即執行新的 不同的程式。所以一般都是fork 系統呼叫建立新程序,然後使用exec 系統呼叫函式組,來建立新的位址空間,把新的程式載入進去。最終,通過exit 系統呼叫退出程序,這個函式會終結程序,並釋放該程序占用的資源。父程序可以通過wait 系統呼叫,檢視子程序是否...