三、舉例
四、**剖析
五、父子程序開始執行的位置
1、程序是程式的執行。程式是靜態的,程序是動態的。
2、程序在記憶體中有三部分組成:資料段、堆疊段和**段。
**段:就是存放程式**的資料,如果有數個程序執行同乙個乙個程式,那麼它們就可以使用同乙個**段(**段是可以共享的);
堆疊段:存放的是子程式的返回位址、引數以及程式的區域性變數,主要是儲存程序的執行的環境,這裡用到了棧先進後出的特性,可以看做具有記憶上一次執行的環境。
資料段:存放程式的全域性變數 、常數
3、動態資料分配的資料空間
系統如果同時執行數個相同的程式,它們之間就不能使用同乙個堆疊段和資料段,但是可以使用同乙個**段(**段是可以共享的)
4、lwp:
執行緒id。在使用者態的命令(比如ps)中常用的顯示方式。
1、標頭檔案
#include#include
2、函式原型pid_t fork( void);
pid_t 是乙個巨集定義
3、返回值
若成功呼叫一次則返回兩個值,子程序返回0,父程序返回子程序id;否則,出錯返回-1
4、注意點
a、在linux系統中建立程序有兩種方式:一是由作業系統建立,二是由父程序建立程序(通常為子程序)。系統呼叫函式fork()是建立乙個新程序的唯一方式,當然vfork()也可以建立程序,但是實際上其還是呼叫了fork()函式。fork()函式是linux系統中乙個比較特殊的函式,其一次呼叫會有兩個返回值。
b、呼叫fork()之後,父程序與子程序的執行順序是我們無法確定的(即排程程序使用cpu),意識到這一點極為重要,因為在一些設計不好的程式中會導致資源競爭,從而出現不可預知的問題。
c、fork產生子程序的表現就是它會返回2次,一次返回0,順序執行下面的**。這是子程序。一次返回子程序的pid,也順序執行下面的**,這是父程序。
d、程序建立成功之後,父程序以及子程序都從fork() 之後開始執行,只是pid不同。fork語句可以看成將程式切為a、b兩個部分。(在fork()成功之後,子程序獲取到了父程序的所有變數、環境變數、程式計數器的當前空間和值)。
e、一般來說,fork()成功之後,父程序與子程序的執行順序是不確定的。這取決於核心所使用的排程演算法,如果要求父子程序相互同步,則要求某種形式的程序間通訊。
5、vfork()函式
也用於建立乙個程序,返回值與fork()相同。
fork()與vfork()的異同
執行次序:
a、fork():對父子程序的排程室由排程器決定的;
b、vfork():是先呼叫子程序,等子程序的exit(1)被呼叫後,再呼叫父程序;
對資料段的影響:
a、fork():父子程序不共享一段位址空間,修改子程序,父程序的內容並不會受影響。
b、vfork():在子程序呼叫exit之前,它在父程序的空間中執行,也就是說會更改 父程序的資料段、棧和堆。。即共享**區和資料區,且位址和內容都是一 樣的。
#include #include #include #include #include #include #includeusing namespace std;
// 程序退出函式
void print_exit()
int main()
}if(pid == -1)
這裡可以看出parent process執行了printf(「hello!\n」); 而child process 沒有執行printf(「hello!\n」);
有乙個讓人很迷惑的例子:
#include #include main ()
此時列印輸出了兩個fork!這不免讓人以為是child process從#include處開始執行,所以也執行了printf(「fork!」); 語句。
其實不然,出現這種問題的原因在於:
這就跟printf的緩衝機制有關了,printf某些內容時,作業系統僅僅是把該內容放到了stdout的緩衝佇列裡了,並沒有實際的寫到螢幕上 。但是,只要看到有\n, 則會立即重新整理stdout,因此就馬上能夠列印了.mian函式(parent process)執行了printf(「fork!」) 後, 「fork!」僅僅被放到了緩衝裡,再執行到fork時,緩衝裡面的 aaaaaa 被子程序(child process)繼承了,因此在子進程度stdout緩衝裡面就也有了」fork!」。所以,你最終看到的會是 「fork!」 被printf了2次!!! 而mian函式(parent process)執行 printf(「fork!\n」)後,」fork!」 被立即列印到了螢幕上,之後fork到的子程序(child process)裡的stdout緩衝裡不會有」fork!」內容 因此你看到的結果會是」fork!」 被printf了1次!!!
c 多程序程式設計
執行緒的優點 1 建立乙個新執行緒的代價要比建立乙個新程序小得多 2 與程序之間的切換相比,執行緒之間的切換需要作業系統做的工作要少很多 3 執行緒占用的資源要比程序少很多 4 能充分利用多處理器的可並行數量 5 在等待慢速i o操作結束的同時,程式可執行其他的計算任務 6 計算密集型應用,為了能在...
linux多程序c程式設計
多程序程式設計 今天覆習了多程序程式設計,共涉及只是大致有程序的建立於結束,退出,終止,等待,休眠,獲取程序號,執行外部的應用程式等的函式使用,還了了解程序與執行緒的區別於相同之處,在此對於pid,ppid,pigid,puid等獲取方式與相關表示就不在陳述,建立程序的兩個主要函式vfork與for...
多程序程式設計
linux下乙個程序在記憶體裡有三部份的資料,就是 資料段 堆疊段 和 段 其實學過組合語言的人一定知道,一般的cpu象i386,都有上述三種段暫存器,以方便作業系統的執行。段 顧名思義,就是存放了程式 的資料,假如機器中有數個程序執行相同的乙個程式,那麼它們就可以使用同一 個 段。堆疊段存放的就是...