2011-12-30 61 views
1

在OS X上,對於叉手冊頁這樣說:在Mac OS X上分叉後可以調用chdir或setenv嗎?

是有限制的,你可以在子進程做什麼。爲了完全安全,您應該限制自己只執行異步信號安全操作,直到調用其中一個exec函數爲止。除非明確記錄爲安全或異步信號安全,否則任何框架或庫中的所有API(包括全局數據符號)都應假定爲在fork()後不安全。如果你需要在子進程中使用這些框架,你必須執行。在這種情況下,自己去執行是合理的。

基於該男子頁面的頁腳,這可能已存在很長一段時間:

4伯克利分銷1993年6月4日第4伯克利分銷

我有認爲chdir(2)可以安全地在fork()和exec()之間調用,但是它的手冊頁並沒有說它對於異步調用是安全的。事實上,這是不安全的嗎?如果是這樣,我真的希望在fork()之前更改目錄嗎?對我來說似乎不合理。

setenv(3)同樣如此。考慮到它調用malloc(),我猜它可能不安全。但是沒有什麼可以讓我通過一個環境的execvp。具體來說,execvp搜索PATH。我能找到的最接近的等價物是一個環境arg,execve(),它不搜索PATH。

回答

1

您引用的第一個文本塊(「有限制...」)是專門爲Mac OS X添加的 - 它試圖指出大多數Apple的庫和框架(AppKit,Carbon,Foundation等)將在fork()後無法正常工作。

據我所知,所有的標準C庫函數,包括chdir()ARE安全fork()後使用。

+0

是的,幾乎所有的東西*但是*在fork()之後都允許CF調用 - 這就是很多服務器/守護進程實現的工作方式。 – 2011-12-31 01:07:29

+0

@duskwuff至少有一些C庫函數在fork後不安全。 – user877329 2014-01-15 09:08:06