在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。
是的,幾乎所有的東西*但是*在fork()之後都允許CF調用 - 這就是很多服務器/守護進程實現的工作方式。 – 2011-12-31 01:07:29
@duskwuff至少有一些C庫函數在fork後不安全。 – user877329 2014-01-15 09:08:06