Linux學(xué)習(xí)—fork用法
linux當(dāng)中可以使用fork函數(shù)創(chuàng)建一個(gè)新進(jìn)程
#include <unistd.h>
pid_t fork(void);
返回值:子進(jìn)程中返回0,父進(jìn)程中返回子進(jìn)程ID,出錯(cuò)返回-1
在fork調(diào)用之后,子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的副本,但是并不共享這些存儲(chǔ)空間部分。
fork的一個(gè)特性是父進(jìn)程的所有打開文件描述符都被復(fù)制到子進(jìn)程中。父、子進(jìn)程的每個(gè)相同的打開描述符共享一個(gè)文件表項(xiàng)。
這種共享文件的方式使父、子進(jìn)程對(duì)同一文件使用了一個(gè)文件偏移量。
fork有兩種用法:
(1)一個(gè)父進(jìn)程希望復(fù)制自己,使父、子進(jìn)程同時(shí)執(zhí)行不同的代碼段。例如,父進(jìn)程等待客戶端的服務(wù)請(qǐng)求,然后fork一個(gè)子進(jìn)程處理這個(gè)請(qǐng)求,自己則繼續(xù)等待下一個(gè)服務(wù)請(qǐng)求。
(2)一個(gè)進(jìn)程要執(zhí)行一個(gè)不同的操作。fork一個(gè)子進(jìn)程之后立馬調(diào)用exec
fork的特殊應(yīng)用:fork兩次可以避免僵死進(jìn)程,(僵死進(jìn)程是指一個(gè)已經(jīng)終止,但是其父進(jìn)程尚未對(duì)其進(jìn)行善后處理的進(jìn)程),父進(jìn)程先fork一個(gè)子進(jìn)程,子進(jìn)程繼續(xù)fork一個(gè)孫子進(jìn)程,然后就直接退出。這樣,父進(jìn)程就可以很快的wait到子進(jìn)程,釋放其資源,不需要阻塞,繼續(xù)自己的操作;而孫子進(jìn)程交由了init進(jìn)程托管,執(zhí)行自己的操作而不用擔(dān)心了。
ps:write函數(shù)不帶緩沖,標(biāo)準(zhǔn)I/O庫是帶緩沖的,如果標(biāo)準(zhǔn)輸出練到終端設(shè)備,則它是行緩沖的,否則它是全緩沖的
posted on 2014-03-27 17:07 順其自然EVO 閱讀(277) 評(píng)論(0) 編輯 收藏 所屬分類: linux