2012-11-20 139 views
5

system()功能通過使用fork(),execve()wait()函數來實現。 我聽說fork()函數在多線程程序中是危險的。 那麼,system()函數在多線程程序中也是危險的?從多線程過程調用系統(3)是否安全?

它可能導致什麼問題?

+2

檢查了這一點,這可能有助於http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them – Intrepidd

回答

1

fork在線程程序中是危險的除非其次是execve。由於只有當前線程是分叉的,因此在execve以外的分叉多線程程序中您可以執行的操作很少。您應該確保在fork之後沒有使用任何鎖。

由於system()確實fork + exec,它應該是安全的。

+1

這是不安全的。文件描述符可能會泄漏 –

1

叉在多線程程序中很危險,因爲它不會複製所有正在運行的線程。它應該與系統一致,但是如果你有信號處理程序和多線程等待(),你可能會再次混亂。

2

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之後的分支是安全的,一般來說(模開放文件描述符)。

相關問題