當前位置:首頁 » 操作系統 » linux進程fork

linux進程fork

發布時間: 2022-10-30 06:35:16

linux中的fork函數到底做了什麼事

額........每啟動一個進程並不一定要執行fork.fork只是系統最後封裝的一個系統調用.你在程序里不使用fork的話.使用其它方式啟動進程.就不是fork.fork族裡有很多函數...............exec也可替換當前進程......系統內核里生成一個進程用的是clone這個函數.
就比如要蓋個房子.一個人干,要先挖土再調水泥再擺磚頭再蓋牆這樣一步一步做.但是如果有多個人.就是可以多個人同時做這些事,一個挖土,一個調水泥.一個擺磚頭.這樣就省了很多時間.進程也是如此.fork的作用就是創建新進程.
這么多人一起蓋房子,總不能各自蓋各自的,需要大家協調來做.不能土沒挖好就擺磚,沒放磚就抹水泥一樣.這個時候需要一個工頭來管理大家.工頭通過每個人的名字來指揮每個人幹活.進程就通過pid來指揮一個進程幹活.工人需要知道自己的工頭是誰,好向他報告碰到的情況.進程需要知道自己的父進程是誰報告自己的情況.
這樣就明白fork為何要返回進程的id了吧?fork是不會返回父進程的id的.
工頭找了一個新工人幹活.從工頭知道這個新工人的名字時刻開始,新工人就會投入這個團隊一起幹活了.fork返回pid的時候就表示這個進程在這個進程團隊里了.工頭可以直接告訴工人要干什麼而不會讓其他工人誤以為這是自己的活.但是程序並沒有這么智能.這個時候就需要有一個狀態(if(!pid){....這是工人乾的活...})表明這個工人的代碼從什麼位置開始,到什麼位置結束.

❷ 請教linux下fork()創建子進程

pid = fork(); //創建進程命令點
if(pid < 0){...} //pid<0,表示fork出錯,程序一般會退出,不會出現pid=0和pid>0的情況

else if(0 == pid){...} //從這個點開始,程序出現分支 pid=0表示fork出來的子進程分支
else{....} //否則是原進程,即父進程

printf("here!"); //如果在上面兩個進程都沒有exit()操作時,執行完{}中的命令,都會走到這里

關於fork出來的父子進程關系,請仔細閱讀linux高級編程中進程一章節,內容很多,細細的閱讀並練習體會吧

❸ linux fork() 進程問題

沒看明白你是怎麼理解的
就按照你的代碼示例來說, 這段代碼從A進程fork一個B進程出來,運行結果是列印4行消息
child id xxx1 // pid of process A
parent id xxx2 // pid of A's parent process
child id xxx3 // pid of process B
parent id xxx4 //pid of B's parent process, exactly equal to the pid of process A
以上這四行輸出有可能A在B的前面,或者B在A的前面,不確定(如果你的CPU是多核);但child總在parent的前面。

事實上關於fork的理解是這樣的, A fork一個進程B出來, A和B都要接著往下運行,但是一般來說A和B是要運行不同的代碼的,那這時候fork執行完接著執行下一句的時候,就需要首先知道當前的context是在A進程中還是在B進程中, 這樣才能確定接著執行什麼。 所以fork就需要返回兩次, 確切的講是在A和B的context中分別返回一次,在A的context中返回的是子進程的pid, 在B的context中返回0,所以創建進程時往往會這樣寫

int ret = fork();
if(0 == ret)
{
printf("hey, I am the child -- Process B\n");
//start to do what you want to handle in Process B
}
else //if ret > 0
{
printf("hey, I am the parent -- Process A\n");
//continue doing what you are working on in Process A
}
通過判斷 fork的返回值來確定當前context是屬於哪個進程,並執行相應的代碼,開始在兩個進程中做各自的事情。

❹ Linux應用程序中出現兩次fork的解釋

一個進程使用fork創建子進程,如果子進程退出,而父進程並沒有調用wait或waitpid獲取子進程的狀態信息,那麼子進程的進程描述符仍然保存在系統中。這種進程稱之為僵死進程。
在一些程序中經常看見使用兩次fork創建子進程,原因如下:
以下摘自《UNIX環境高級編程》
如果一個進程fork一個子進程,但不要它等待子進程終止,也不希望子進程處於僵死狀態直到父進程終止,實現這一要求的技巧是調用fork兩次。程序如下:
#include
"apue.h"
#include
<sys/wait.h>
int
main(void)
{

❺ linux中的fork是創建進程還是線程

fork是創建進程,pthread是線程。

❻ linux 創建進程為什麼fork

創建子進程才能多道程序並發執行,linux初始化的時候會創建swap進程、然後是init進程和一個init進程的兄弟進程,所有的進程(運行的程序)都是從父進程演化出去的,你可以看看proc里的東西,寫個程序列印出各個進程的父進程~網上有源代碼的,要的話我給你咱要先搞明白進程究竟是什麼,進程是資源分配的單位,是運行的程序。既然是運行的程序,一個進程自然只能代表一個程序,多道程序設計自然而然就有了多進程的概念。舉個例子,多進程(線程)下載,我們可以給一個需要下載的資源分片,多個進程從不同的片分時下載,這樣就提高了下載速度,因為對一個程序分配的更多的資源,你試試開迅雷的時候打開個網頁,保證你覺得奇卡無比,因為網路帶寬(資源)被迅雷的多個進程佔用了。其實在本地的多進程程序並不多見,比如word算是個典型的多進程程序,有個進程接受你的鍵盤輸入,有拼寫檢查進程,有顯示進程等等。大多數都用到網路上了,比如伺服器。一台伺服器要在「同一時間」處理來自很多客戶端的請求,這就必須使用多進程。

❼ linux fork 會共享哪些東西

fork()不僅創建出與父進程代碼相同的子進程,而且父進程在fork執行點的所有上下文場景也被自動復制到子進程中,包括:
—全局和局部變數
—打開的文件句柄
—共享內存、消息等同步對象
由於pipe調用相當於創建了2個文件句柄,因此在fork後這兩個句柄也被自動復制到子進程中,對這兩個句柄的操作效果與在主進程中的操作效果是一致的,這就使父子進程之間很容易通過該機制實現數據交換,如:
假設pipe產生的句柄為P[0],P[1],在fork後父子進程都擁有了P[0],P[1]句柄,那麼:
—父進程可向自己的P[1]中寫入數據,子進程從P[0]中即可讀出該數據;切記此時父進程不能也從P[0]讀數據,否則自己寫入的數據可能先被自己讀走了
—反之亦然,子進程向P[1]中寫入數據後,父進程從P[0]中可讀出該數據;切記此時子進程不要從P[0]讀走數據
你可能難以理解為什麼進程內部的數據讀寫會被傳遞到另一個進程,但別忘了,pipe匿名管道和文件,socket等一樣是屬於操作系統的管理對象,對其進行讀寫都是由OS的內核代碼來進行控制的。在父進程調用pipe創建出管道後,該管道對象是存儲在OS內部的,父進程得到的P[0]和P[1]都只是對該對象的引用(相當於指針);在fork出子進程後,子進程復制出的也只是同一個指針,所指向的還是OS中的同一個對象,這就是為什麼父子進程能通過其進行互相通信的原因。

❽ 關於Linux的fork()

= OR ==
你初學者吧,請把賦值 =

和 == 值比較 搞清楚啊
= value assignment
== value compare

❾ linux中fork創建進程 新進程是從頭開始執行嗎

fork系統調用是「復制」進程,所以復制出來的子進程是從代碼的最開始從頭執行的。如果是要用fork,就需要規劃好代碼,因為代碼裡面可能需要加上對父進程、子進程的區分判斷,父進程、子進程根據需要可能要執行不同的代碼。

❿ linux fork進程怎麼調試

如果你想跟蹤子進程進行調試,可以使用set follow-fork-mode mode來設置fork跟隨模式。
set follow-fork-mode 所帶的mode參數可以是以下的一種:
parent
gdb只跟蹤父進程,不跟蹤子進程,這是默認的模式。
child
gdb在子進程產生以後只跟蹤子進程,放棄對父進程的跟蹤。
進入gdb以後,我們可以使用show follow-fork-mode來查看目前的跟蹤模式。

可以看到目前使用的模式是parent。

然而,有的時候,我們想同時調試父進程和子進程,以上的方法就不能滿足了。Linux提供了set detach-on-fork mode命令來供我們使用。其使用的mode可以是以下的一種:
on
只調試父進程或子進程的其中一個(根據follow-fork-mode來決定),這是默認的模式。
off
父子進程都在gdb的控制之下,其中一個進程正常調試(根據follow-fork-mode來決定)
另一個進程會被設置為暫停狀態。
同樣,show detach-on-fork顯示了目前是的detach-on-fork模式,如上圖。

以上是調試fork產生子進程的情況,但是如果子進程使用exec系統函數而裝載了新程序執行呢?——我們使用set follow-exec-mode mode提供的模式來跟蹤這個exec裝載的程序。mode可以是以下的一種:
new 當發生exec的時候,如果這個選項是new,則新建一個inferior給執行起來的子進程,而父進程的inferior仍然保留,當前保留的inferior的程序狀態是沒有執行。
same 當發生exec的時候,如果這個選項是same(默認值),因為父進程已經退出,所以自動在執行exec的inferior上控制子進程。

熱點內容
安卓的AndroidAuto 發布:2025-05-13 19:41:49 瀏覽:357
下載安裝python 發布:2025-05-13 19:39:21 瀏覽:27
蘋果手機如何退出ad密碼 發布:2025-05-13 19:35:24 瀏覽:353
資本論中央編譯局 發布:2025-05-13 19:21:50 瀏覽:134
python路徑是否存在 發布:2025-05-13 19:08:38 瀏覽:570
保時捷卡宴哪個配置比較好 發布:2025-05-13 19:00:08 瀏覽:725
c語言負數運算 發布:2025-05-13 18:45:21 瀏覽:428
太空殺電腦版連接不到伺服器 發布:2025-05-13 18:40:19 瀏覽:457
同樣的配置為什麼跑分不同 發布:2025-05-13 18:39:06 瀏覽:279
獲取linuxcpu序列號 發布:2025-05-13 18:36:35 瀏覽:738