[英]Questions Related To Forking a Process
我正在創建一個服務器,我使用fork()來創建子進程,但我對此有疑問。 這里有一些:
PS我很確定我知道第二個問題的答案,即clone(),但只是想確保這是正確的功能。
int
是句柄,但套接字本身仍與進程相關聯。 孩子關閉監聽套接字主要是出於安全原因(它不需要它,如果孩子產生另一個進程,該進程也會繼承套接字); 服務器進程關閉新連接的套接字,否則連接將保持打開狀態,直到服務器進程退出(只要至少有一個進程仍有句柄,就會存在套接字)。
您要么需要多線程,要么需要適當的共享內存方法。 這就是樂趣的開始。
獨立進程之間的共享內存帶來了有趣的問題,但也提供了其他不可能的功能(例如,您可以重新啟動主服務器進程並使運行開放連接的進程保持運行,這很難在兩個不同版本的服務中正確運行必須互相交談,但允許無縫升級,無需斷開客戶端連接或中斷服務)。
在線程之間共享內存相對容易,但是線程共享同一組文件描述符,所以你不會在這里贏得太多。
最后,還有第三種選擇:觀察多個套接字的事件循環,只有在實際發生某些事情時才注意每個套接字。 查看select
和poll
函數的文檔。
Unix中的套接字是文件描述符,它們確實是整數,如用戶所見,但它們實際上是內核為每個進程維護的表的索引。 在該表中,每個文件描述符 (FD)指的是在內核中維護的系統范圍對象的開放文件描述 (OFD)。 當你執行fork()
,打開的文件描述符是重復的,並且child和parent指向同一個OFD。 有兩個引用相同OFD的FD通常不是問題,但特別是對於套接字,它們可能會有細微的問題,因為只有在關閉引用它的所有 FD時才關閉連接。
您應該考慮使用線程(如果使用線程,請不要關閉套接字!)。 clone
是一個linux系統調用,不能直接使用。 您可以選擇使用共享內存,但它更復雜。
分叉復制文件描述符,因此您必須關閉副本。
分叉也有效地復制了所有內存(雖然在實踐中它是寫時復制,因此它並不是非常昂貴)。 除非您明確設置了一些共享內存,否則您創建一個完全獨立於父進程的新進程 。
也許你打算產生一個新的線程而不是分支一個新的進程 ?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.