簡體   English   中英

與分叉流程相關的問題

[英]Questions Related To Forking a Process

我正在創建一個服務器,我使用fork()來創建子進程,但我對此有疑問。 這里有一些:

  1. 為什么需要在子進程中關閉主套接字並在父進程中接受新連接接受套接字? (在接受新連接之后)我認為套接字只是帶有一些id的整數,用於訪問某些系統范圍對象中打開的套接字,這只能通過系統函數調用來接受。 在這種情況下,fork只會復制整數,但對打開的套接字沒有影響。
  2. 我檢查過並發現如果我在一個類方法中分叉一個進程,那么所有成員都會被復制。 好吧,我發現它是copy-on-edit所以它是否意味着我的服務器類將被復制到每個使用非常量函數的子節點中? 如何在所有這些進程之間共享一些內存(比如任務列表和每個孩子在父進程中讀取內容時將某些內容放入其中)? 我認為fork不是正確的功能。 什么是最好的方法?

PS我很確定我知道第二個問題的答案,即clone(),但只是想確保這是正確的功能。

  1. int是句柄,但套接字本身仍與進程相關聯。 孩子關閉監聽套接字主要是出於安全原因(它不需要它,如果孩子產生另一個進程,該進程也會繼承套接字); 服務器進程關閉新連接的套接字,否則連接將保持打開狀態,直到服務器進程退出(只要至少有一個進程仍有句柄,就會存在套接字)。

  2. 您要么需要多線程,要么需要適當的共享內存方法。 這就是樂趣的開始。

獨立進程之間的共享內存帶來了有趣的問題,但也提供了其他不可能的功能(例如,您可以重新啟動主服務器進程並使運行開放連接的進程保持運行,這很難在兩個不同版本的服務中正確運行必須互相交談,但允許無縫升級,無需斷開客戶端連接或中斷服務)。

在線程之間共享內存相對容易,但是線程共享同一組文件描述符,所以你不會在這里贏得太多。

最后,還有第三種選擇:觀察多個套接字的事件循環,只有在實際發生某些事情時才注意每個套接字。 查看selectpoll函數的文檔。

  1. Unix中的套接字是文件描述符,它們確實是整數,如用戶所見,但它們實際上是內核為每個進程維護的表的索引。 在該表中,每個文件描述符 (FD)指的是在內核中維護的系統范圍對象的開放文件描述 (OFD)。 當你執行fork() ,打開的文件描述符是重復的,並且child和parent指向同一個OFD。 有兩個引用相同OFD的FD通常不是問題,但特別是對於套接字,它們可能會有細微的問題,因為只有在關閉引用它的所有 FD時才關閉連接。

  2. 您應該考慮使用線程(如果使用線程,請不要關閉套接字!)。 clone是一個linux系統調用,不能直接使用。 您可以選擇使用共享內存,但它更復雜。

分叉復制文件描述符,因此您必須關閉副本。

分叉也有效地復制了所有內存(雖然在實踐中它是寫時復制,因此它並不是非常昂貴)。 除非您明確設置了一些共享內存,否則您創建一個完全獨立於父進程的新進程

也許你打算產生一個新的線程而不是分支一個新的進程

我想你可能想看看這本書作為fork()的參考。

  1. 是的,您確實需要關閉綁定的套接字以偵聽子進程中的子套接字套接字。 又名文件句柄點到實際結構的整數看到這個 ,除非你想讓內核傾倒在一個孩子或父母能夠將數據發送到你可能想避免這種情況完全連接的客戶端的新連接左右。
  2. 要在進程之間共享數據,最好的方法是共享內存。 我推薦你的那本書也會有相關的信息。 通常,如果您需要共享沒有共享內存的內存,那么您可能希望查看線程。

PS我不確定你指的是哪種clone()方法。 對象復制通過復制構造函數完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM