system()
功能通過使用fork()
,execve()
和wait()
函數來實現。 我聽說fork()
函數在多線程程序中是危險的。 那麼,system()
函數在多線程程序中也是危險的?從多線程過程調用系統(3)是否安全?
它可能導致什麼問題?
system()
功能通過使用fork()
,execve()
和wait()
函數來實現。 我聽說fork()
函數在多線程程序中是危險的。 那麼,system()
函數在多線程程序中也是危險的?從多線程過程調用系統(3)是否安全?
它可能導致什麼問題?
fork
在線程程序中是危險的除非其次是execve
。由於只有當前線程是分叉的,因此在execve
以外的分叉多線程程序中您可以執行的操作很少。您應該確保在fork
之後沒有使用任何鎖。
由於system()
確實fork
+ exec
,它應該是安全的。
這是不安全的。文件描述符可能會泄漏 –
叉在多線程程序中很危險,因爲它不會複製所有正在運行的線程。它應該與系統一致,但是如果你有信號處理程序和多線程等待(),你可能會再次混亂。
system()
函數不一定是線程安全的。
POSIX.1-2008 specifies(以及POSIX.1-2001):
系統()函數不一定是線程安全的。
例如,Solaris 10 documents system()
as thread-unsafe:
的系統()函數操縱信號處理程序 SIGINT,SIGQUIT和SIGCHLD。因此,在多線程進程中呼叫系統()是不安全的,因爲操縱這些信號處理程序的線程和線程 同時調用system()會以破壞性方式干擾其他每個線程。
該手冊頁還建議popen()
爲線程安全的解決方法。請注意,popen()
不會更改任何信號處理程序。在Linux上,system()
is thread-safe。
請注意,system()
不一定要求fork()
。相反,實現可以使用vfork()
。或者,在Linux上,它可以直接調用clone()
。它甚至可以使用posix_spawn()
。
雖然forking in a multi-threaded program can be challenging,但直接跟在exec之後的分支是安全的,一般來說(模開放文件描述符)。
檢查了這一點,這可能有助於http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them – Intrepidd