2014-02-08 58 views
1

在Unix上,我知道調用fork()之後,我需要重置我的信號掩碼並關閉我不希望孩子擁有的文件描述符調用exec()。在執行fork之前的所有清理步驟的官方文檔

但是,我還需要做什麼?

是否有一個全面的文檔,列出所有的事情,你可能想要清理分叉子進程時,爲了給它一個很好的標準執行環境?

我目前在Linux上,但我想要一個包含其他Unix的詳細信息的文檔,以及可能的方法來爲它們進行autoconf測試。

回答

0

fork(3)提供了comprehensive list。在這裏引用是有點長,但根據SO政策我會這麼做:

fork()函數將創建一個新的進程。新進程(子 過程)應除詳述如下是調用進程(父 過程)的精確副本:

  • 子進程應具有獨特的進程ID。
  • 子進程ID也不能匹配任何活動的進程組ID。
  • 子進程應該有一個不同的父進程ID,它應該是調用進程的進程ID。
  • 子進程應該有它自己的父文件描述符副本。每個兒童的文件描述符應參考 相同的打開文件描述以及相應的父文件描述符 。
  • 子進程應擁有其父節點的打開目錄流的副本。子進程中的每個打開的目錄流可能與目標流的 共享目錄流定位,並且父流的相應目錄爲 。
  • 子進程應擁有其父節點的消息目錄描述符的副本。
  • tms_utime,tms_stime,tms_cutime和tms_cstime的子進程值應被設置爲0.
  • 鬧鈴時鐘信號將被重置爲零並且如果有的話應該被取消的時間;看到報警()。
  • 所有semadj值應被清除。
  • 父進程設置的文件鎖不應該被子進程繼承。
  • 爲子進程掛起的一組信號應初始化爲空集。
  • 應在子進程中重置間隔定時器。
  • 在父進程中打開的任何信號量也應該在子進程中打開。
  • 子進程不應繼承由父進程通過調用mlockall()或mlock()建立的任何地址空間內存鎖。
  • 在父進程中創建的內存映射應保留在子進程中。從父級繼承的MAP_PRIVATE映射也應該是子級中的MAP_PRIVATE映射,並且父級在調用fork()之前在這些映射中對數據 所做的任何修改應爲 對子級可見。在fork()返回後由父級進行MAP_PRIVATE 映射中對數據的任何修改,只能向父級顯示 。對小孩進行的MAP_PRIVATE映射中的數據 的修改應僅對兒童可見。
  • 對於SCHED_FIFO和SCHED_RR調度策略,子進程應該在fork()函數期間繼承父進程的策略和優先級設置。對於其他調度策略,fork()上的 策略和優先級設置是實現定義的。
  • 父進程創建的進程定時器不應該被子進程繼承。
  • 子進程應擁有父進程的消息隊列描述符的副本。 孩子的每個消息描述符應參考與父對應消息描述符相同的開放消息隊列描述。
  • 不應該由子進程繼承異步輸入或異步輸出操作。
  • 一個進程應該創建一個單線程。如果多線程進程調用fork(),則新進程應包含調用線程的副本及其整個地址空間,可能包括互斥鎖和其他資源的狀態。因此,爲了避免錯誤,子進程可能只會執行異步信號安全操作,直到調用其中一個exec函數爲止的時間爲 。通過pthread_atfork()函數建立的分叉處理程序可能是 ,以便 跨fork()調用維護應用程序不變量。當 應用程序從信號處理程序調用fork(),並且任何由pthread_atfork()註冊的fork 處理程序調用asynch-signal-safe時不是 的函數時,行爲是未定義的。
  • 如果同時支持Trace選項和Trace Inherit選項:如果調用進程在其繼承策略設置爲POSIX_TRACE_INHERITED的跟蹤流中被跟蹤,則子進程 應被跟蹤到該跟蹤流中,並且子進程 將繼承父級的跟蹤事件名稱映射,以跟蹤事件類型 標識符。如果跟蹤調用進程爲 的跟蹤流將其繼承策略設置爲 POSIX_TRACE_CLOSE_FOR_CHILD,則子進程不得跟蹤 到該跟蹤流中。繼承策略通過調用 posix_trace_attr_setinherited()函數來設置。
  • 如果支持跟蹤選項,但不支持跟蹤繼承選項:子進程不應跟蹤到其父進程的任何 跟蹤流。
  • 如果支持跟蹤選項,跟蹤控制器進程的子進程將不控制由其父進程控制的跟蹤流。
  • 子進程的CPU時鐘的初始值應設置爲零。
  • 子進程的單線程的CPU時鐘的初始值應設置爲零。 IEEE Std 1003.1-2001定義的所有其他過程特徵 在父進程和子進程中應該相同。IEEE Std 1003.1-2001定義的工藝特性的繼承不是 ,IEEE Std 1003.1-2001未指定。
+0

這個描述了我**不必擔心的一切。例如,它沒有提到有關信號掩碼的任何信息,因爲信號掩碼是您需要清理自己的東西。 我正在尋找既不是fork()也不是exec()爲你照顧的東西的列表。 – dataless

+0

嗯,你是部分正確的。它確實提到了文件描述符,目錄流和消息隊列描述符,這些都是潛在的問題。 – Thomas

相關問題