linux中fork和exec

來源:互聯網
上載者:User

學過C語言的都知道,Unix下某個進程的記憶體分成三部分:程式碼片段,堆棧段,資料區段。程式碼片段用來存放程式啟動並執行代碼,堆棧段用來存放子程式的局部變數,資料區段用來存放全域變數。這在perl裡也是一樣的。
perl的fork調用,跟C的一樣,當發生fork調用時,實際上發生如下事:
父進程將程式碼片段,堆棧段,資料區段完全複製一份給子進程。也就是說,在子進程運行之初,它擁有父進程的一切變數和控制代碼。例如,父進程申明了某個hash表,那這個hash表也會被子進程擁有。
然而,一旦子進程開始運行,它的資料區段和堆棧段就在記憶體裡完全和父進程分離開了。也就是說,兩個進程間不再共用任何資料。例如前面所說的hash表,雖然子進程從父進程處繼承了這個資料結構,但子進程寫往hash裡的資料,不會被父進程訪問到。在shell裡用ps命令,可以看到2個獨立啟動並執行進程。通常你 kill掉1個,不會影響另1個的運行。
那麼父進程和fork出來的子進程如何通訊呢?父進程和子進程間的通訊有多種方法,最常見的是訊號,另外還有管道,Socket,訊息佇列等,不在這裡詳敘。而2個進程間共用資料的辦法,可以用線程或共用記憶體,我對這方面不熟悉。
如果大概明白了fork,那麼exec就容易理解了。一個進程一旦調用exec類函數,它本身就“死亡”了,系統把程式碼片段替換成新的程式的代碼,廢棄原有的資料區段和堆棧段,並為新程式分配新的資料區段與堆棧段,唯一留下的,就是進程號,也就是說,對系統而言,還是同一個進程,不過已經是另一個程式了。
在perl裡,調用exec後,原進程就完全消失,由於消失了,它也就不會從新進程接受到任何傳回值,除非新進程意外終止,原進程會接受到錯誤值。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.