fork函數(shù)通過系統(tǒng)調(diào)用創(chuàng)建一個與原來進(jìn)程幾乎完全相同的進(jìn)程计济。一個進(jìn)程調(diào)用fork()函數(shù)后灸撰,系統(tǒng)先給新的進(jìn)程分配資源,例如存儲數(shù)據(jù)和代碼的空間烧栋。然后把原來的進(jìn)程的所有值都復(fù)制到新的新進(jìn)程中斟珊。相當(dāng)于克隆了一個自己苇倡。
也就是說,原來的進(jìn)程和fork出來的子進(jìn)程的進(jìn)程空間是完全一樣的囤踩,包括 代碼段旨椒,數(shù)據(jù)段,bss段堵漱,堆區(qū)综慎,共享內(nèi)存,棧區(qū)勤庐。如下圖所示:
下面是幾個關(guān)于子進(jìn)程復(fù)制父進(jìn)程的內(nèi)存空間的一些細(xì)節(jié):
寫時拷貝
再進(jìn)行內(nèi)存空間的復(fù)制的時候示惊,這里使用了copy-and-write(寫時拷貝)的方式。簡單的說愉镰,就是資源的復(fù)制是在需要寫入的時候才會進(jìn)行米罚,在此之前,只有以只讀方式共享丈探。(寫時拷貝是一種可以推遲甚至避免拷貝數(shù)據(jù)的技術(shù)阔拳。內(nèi)核此時并不復(fù)制整個進(jìn)程的地址空間,而是讓父子進(jìn)程共享同一個地址空間。只用在需要寫入的時候才會復(fù)制地址空間糊肠,從而使各個進(jìn)行擁有各自的地址空間。)fork 之后 關(guān)于文件的問題
在Linux系統(tǒng)中遗锣,常常存在許多對文件的操作货裹,fork()的執(zhí)行將會對文件操作帶來一些小麻煩。由于子進(jìn)程會將父進(jìn)程的大多數(shù)數(shù)據(jù)拷貝一份精偿,這樣在文件操作中就意味著子進(jìn)程會獲得父進(jìn)程所有文件描述符的副本弧圆。(也就是文件句柄包含著當(dāng)前文件的偏移量以及文件狀態(tài)標(biāo)志 都是完全相同的)
-
vfork 和 fork的區(qū)別
vfork與fork相似,但是也有區(qū)別,具體區(qū)別歸結(jié)為以下3點(diǎn):fork() 子進(jìn)程拷貝父進(jìn)程的數(shù)據(jù)段笔咽,代碼段. vfork() 完全和父進(jìn)程共享內(nèi)存搔预,包括堆、BSS叶组、初始化非0數(shù)據(jù)區(qū)等區(qū)域拯田。
fork() 父子進(jìn)程的執(zhí)行次序不確定. vfork():保證子進(jìn)程先運(yùn)行。
為什么要使用 vfork甩十?
因為以前的fork當(dāng)它創(chuàng)建一個子進(jìn)程時船庇,將會創(chuàng)建一個新的地址空間,并且拷貝父進(jìn)程的資源侣监,而往往在子進(jìn)程中會執(zhí)行exec調(diào)用鸭轮,這樣,前面的拷貝工作就是白費(fèi)力氣了橄霉,這種情況下窃爷,聰明的人就想出了vfork
-
fork函數(shù)在執(zhí)行復(fù)制內(nèi)存空間的時候,之前會做什么姓蜂?
https://blog.csdn.net/wenqian1991/article/details/46367213linux 進(jìn)程:
https://blog.csdn.net/wenqian1991/article/details/38798289
https://blog.csdn.net/wenqian1991/article/details/23865457
-
什么是僵尸進(jìn)程按厘?
進(jìn)程退出后,系統(tǒng)會把該進(jìn)程的狀態(tài)變成Zombie覆糟,然后給上一定的時間等著父進(jìn)程來收集其退出信息刻剥,因為可能父進(jìn)程正忙于別的事情來不及收集,所以滩字,使用Zombie狀態(tài)表示進(jìn)程退出了造虏,正在等待父進(jìn)程收集信息中。# 查看僵尸進(jìn)程 ps -aux | grep ‘Z’
-
如何防止僵尸進(jìn)程的出現(xiàn)麦箍?
子進(jìn)程結(jié)束的時候漓藕,會產(chǎn)生一個sigchld信號⌒眩可以在父進(jìn)程里面加入對這個信號的處理函數(shù)享钞。在處理信號的函數(shù)里面調(diào)用wait 或 wait_pid 函數(shù),回收子進(jìn)程诀蓉。這里有一個問題栗竖,就是如果有100個子進(jìn)程需要收回暑脆,每一個子進(jìn)程結(jié)束的時候,都會發(fā)送sigchild信號狐肢。很有可能是同時發(fā)送信號添吗。但是信號機(jī)制,是不支持排隊的份名。所以碟联,在信號處理的函數(shù)里面要調(diào)用wait_pid + WNOHANG參數(shù)。
WNOHANG參數(shù) 表示即使沒有子進(jìn)程退出僵腺,它也會立即返回鲤孵,不會像wait那樣永遠(yuǎn)等下去。 這樣wait_pid就不會阻塞
如果感興趣的話辰如,可以看這個 :
https://www.cnblogs.com/wuchanming/p/4020463.html -
關(guān)于進(jìn)程打開文件 以及 文件系統(tǒng)的補(bǔ)充
一個進(jìn)程去打開一個文件之后普监,會返回一個文件描述符。這個描述符對應(yīng)了一個文件打開表丧没。文件打開表對應(yīng)著inode的結(jié)點(diǎn)鹰椒。inode對應(yīng)block。