linux多程序程式設計

2021-05-09 22:44:10 字數 1312 閱讀 6515

在linux中,執行的乙個程序,會占去linux的三個地方,**區,堆疊區和資料區.如果同時執行多個相同的程式,他們就會使用相同的**區,**區中存放的就程式的**,但是資料區和堆疊區分別存放的是程式的資料,全域性變數和區域性變數,因此即使是相同的程式,也不可同時使用相同的資料和堆疊區.

#include

#include

int main()

if(fork() == 0)

printf("first./n");

if(fork() == 0)

printf("second./n");

else

printf("third./n");

else

printf("fourth./n");

if(fork() == 0)

printf("fivth./n");

else

printf("sixth./n");

可以關注下程式的執行結果,以及輸出的順序,並理解為什麼是這種輸出結果.

fork()函式:

程式呼叫fork()函式,系統就為新的程序準備了堆疊區,資料區和**區.系統先讓fork()出的程序和原先的程序使用同乙個**區.那麼資料區和堆疊區就不能共享了,因此系統會複製乙份完全一抹一樣的給fork()出的那個程序.這樣父程序的所有資料就給了子程序.這樣子程序開始執行時,雖然複製了父程序的資料和堆疊,但是資料和堆疊已經分開了,相互之間已經沒有影響了.對於父程序,fork()函式返回了子程序的程序號,對於子程序,fork()函式則返回0,因此根據fork()函式的返回值就能知道,程式現在處的位置是在子程序中還是在父程序中.

也就是傳說中的,乙個函式具有兩個返回值,就是指fork()函式.

那麼引來乙個問題...如何在乙個程序中讓另外乙個程序啟動呢..?

在linux中,基本上使用exec類的函式,但是exec類函式的使用有乙個特點就是:一旦你使用exec類的函式,原先的程序就廢掉了,因為**段會被新的程序佔據,資料區和堆疊區也會被廢掉,並產生新的資料區和堆疊區供新的程序使用.唯一沒有變的就是程序號,實際上,只有pid是一樣的,其他的東西已經物是人非了.對系統而言,還是同乙個程序,因為系統只認程序號,而對程式設計而言,已經完全是乙個新的程序了.

那麼...又來了...

如果你想繼續原先的程序執行,並且同時啟動新的程序..要怎麼辦..?

看上面我給的**...對了..就是利用fork()函式和exec類的函式搭配使用.

fork()出乙個和父程序完全一抹一樣的程序,然後再使用exec類函式來啟動新的程序,這樣,原先的程序也在執行,新的程序也在執行了.只不過,區別是,現在的關係變成了父程序和子程序的關係了,而不是原來的同乙個程序的關係.

linux 多程序程式設計基礎

一 linux下程序的理解 linux環境下乙個程序在記憶體中有三部分資料 資料段 堆疊段和 段 段 就是存放程式 的資料,如果有數個程序執行乙個程式,那麼他們就可以使用同乙個 段 堆疊段 存放的是子程式的返回位址 引數以及程式的區域性變數 資料段 存放程式的全域性變數 常數以及動態資料分配的資料空...

linux多程序c程式設計

多程序程式設計 今天覆習了多程序程式設計,共涉及只是大致有程序的建立於結束,退出,終止,等待,休眠,獲取程序號,執行外部的應用程式等的函式使用,還了了解程序與執行緒的區別於相同之處,在此對於pid,ppid,pigid,puid等獲取方式與相關表示就不在陳述,建立程序的兩個主要函式vfork與for...

linux 多程序程式設計詳解

include includepid t fork void pid t 是乙個巨集定義,其實質是int 被定義在 include 若成功呼叫一次則返回兩個值,子程序返回0,父程序返回子程序id 否則,出錯返回 1 也用於建立乙個程序,返回值與fork 相同。fork 與vfork 的異同 建立子程...