linux程序控制程式設計

2021-08-13 02:46:16 字數 3983 閱讀 6345

一、程序與程式

程式是放到磁碟的可執行檔案

程序是指程式執行的例項

程序是動態的,程式是靜態的:程式是有序**的集合;程序是程式的執行。通常程序不可在計算機之間遷移;而程式通常對應著檔案、靜態和可以複製。

程序是暫時的,程式使長久的:程序是乙個狀態變化的過程,程式可長久儲存。

程序與程式組成不同:程序的組成包括程式、資料和程序控制塊(即程序狀態資訊)。

程序與程式的對應關係:通過多次執行,乙個程式可對應多個程序;通過呼叫關係,乙個程序可包括多個程式。

二、linux程序

linux系統是乙個多程序的系統,它的程序之間具有並行性、互不干擾等特點。

linux中的程序包含3個段,分別為「資料段」、「**段」和「堆疊段」。

「資料段」存放的是全域性變數、常數以及動態資料分配的資料空間;

「**段」存放的是程式**的資料。

「堆疊段」存放的是子程式的返回位址、子程式的引數以及程式的區域性變數等。

三、幾個概念

1、程序id(pid):標識程序的唯一數字

父程序的id(ppid)

啟動程序的使用者id(uid)

2、程序互斥是指當有若干程序都要使用某一共享資源時,任何時刻最多允許乙個程序使用,其他要使用該資源的程序必須等待,直到占用該資源者釋放了該資源為止。

3、臨界資源:作業系統中將一次只允許乙個程序訪問的資源稱為臨界資源。

4、臨界區:程序中訪問臨界資源的那段程式**稱為臨界區,為實現對臨界資源的互斥訪問,應保證諸程序互斥地進入各自的臨界區。

5、程序同步:一組併發程序按一定的順序執行的過程稱為程序間的同步,具有同步關係一組併發程序稱為合作程序,合作程序間互相傳送的訊號稱為訊息或事件。

6、死鎖:多個程序因競爭資源而形成一種僵局,若無外力作用,這些程序都將永遠不能再向前推進。

四、獲取id

pid_t getpid(void) 獲取本程序id

pid_t getppid(void) 獲取父程序id

#include

#include

#include

int main()

五、程序建立

pid_t fork(void)

功能:建立子程序 fork的奇妙之處在於它被呼叫一次,卻返回兩次,它可能有三種不同的返回值:

0: 子程序

子程序id(大於0):父程序

-1: 出錯

#include

#include

#include

#include

int main()

else

if(0 == pid)

else

return0;}

//子程序的資料空間、堆疊空間都會從父程序得到乙個拷貝,而不是共享。

pid_t vfork(void)

功能:建立子程序

vfork()會產生乙個新的子程序,其子程序會複製父程序的資料與堆疊空間,並繼承父程序的使用者**,組**,環境變數、已開啟的檔案**、工作目錄和資源限制等。

子程序不會繼承父程序的檔案鎖定和未處理的訊號。

vfork子程式先執行

#include

#include

#include

#include

int main()

else

if(0 == pid)

else

return

0;}

fork和vfork的區別:

1、fork:子程序拷貝父程序的資料段

vfork:子程序與父程序共享資料段

2、fork:父、子程序的執行次序不確定

vfork:子程序先執行,父程序後執行

六、exec函式族

exec用被執行的程式替換呼叫它的程式。

區別:fork建立乙個新的程序,產生乙個新的pid。

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

例:execl

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

引數:

path:被執行程式名(含完整路徑)。

arg1 – argn: 被執行程式所需的命令列引數,含程式名。以空指標(null)結束。

#include

#include

#include

#include

int main()

else

if(0 == pid)

else

return

0;}

execv

int execv (const char * path, char * const argv[ ])

引數:

path:被執行程式名(含完整路徑)。

argv: 被執行程式所需的命令列引數陣列。

#include

#include

int main()

; execv("home/12.06/test",argv);

return

0;}

七、程序等待

pid_t wait (int * status)

功能:阻塞該程序,直到其某個子程序退出。

pid_t waitpid (pid_t pid, int * status, int options)

功能:會暫時停止目前程序的執行,直到有訊號來到或子程序結束

引數:如果不在意結束狀態值,則引數status可以設成null。

引數pid為欲等待的子程序識別碼:

pidpid=-1 等待任何子程序,相當於wait()。

pid=0 等待程序組識別碼與目前程序相同的任何子程序。

pid>0 等待任何子程序識別碼為pid的子程序。

引數option可以為0 或下面的or 組合

wnohang: 如果沒有任何已經結束的子程序則馬上返回,不予以等待。

wuntraced :如果子程序進入暫停執**況則馬上返回,但結束狀態不予以理會。

#include

#include

#include

#include

#include

#include

int main()

else

if(0 == pid)

else

if(wifexited(status))

return

0;}

八、殭屍程序

殭屍程序指的是那些雖然已經終止的程序,但仍然保留一些資訊,等待其父程序為其收屍。

如果乙個程序在其終止的時候,自己就**所有分配給它的資源,系統就不會產生所謂的殭屍程序了。

九、程序退出

exit,_exit用於終止程序

區別:

_exit: 直接使程序停止,清除其使用的記憶體,並清除緩衝區中內容

exit與 _exit的區別:在停止程序之前,要檢查檔案的開啟情況,並把檔案緩衝區中的內容寫回檔案才停止程序。

void exit(int status);

exit()用來正常終結目前程序的執行,並把引數status返回給父程序,而程序所有的緩衝區資料會自動寫回並關閉未關閉的檔案。

void _exit(int status);

_exit()用來立刻結束目前程序的執行,並把引數status返回給父程序,並關閉未關閉的檔案。

此函式呼叫後不會返回,並且會傳遞sigchld訊號給父程序,父程序可以由wait函式取得子程序結束狀態。

Linux 程序控制程式設計

1 fork 在linux 中建立乙個新程序的惟一方法是使用fork 函式。fork 函式是linux 中乙個非常重要的函式,和 讀者以往遇到的函式有一些區別,因為它看起來執行一次卻返回兩個值。難道乙個函式真的能返回兩個值 嗎?希望讀者能認真地學習這一部分的內容。1 fork 函式說明。fork 函...

Linux程序控制程式設計(五)

一 程序建立 在pid fork 之前,只有乙個程序在執行,但在這條語句執行之後,就變成兩個程序在執行了,這兩個程序的共享 段,將要執行的下一條語句都是if pid 0 兩個程序中,原來就存在的那個程序被稱作 父程序 新出現的那個程序被稱作 子程序 父子程序的區別在於程序識別符號 pid 不同.例 ...

linux程式設計之程序控制

一 fork include pid t fork void 返回值 有兩個,乙個是子程序的id,另乙個為零。當返回值為0時,進入子程序,大於0進入父程序,返回 1時建立程序錯誤。子程序與父程序的比較 1 子程序與父程序的程序id不同。且父程序id不同。2 記憶體布局 子程序是父程序的副本,其中子程...