从多线程进程调用system(3)是否安全?

SKi*_*SKi 7 c linux multithreading fork

system()功能是通过使用实现fork(),execve()wait()功能.我听说这个fork()函数在多线程程序中很危险.那么,这个system()函数在多线程程序中是否也很危险?

它可能导致什么问题?

max*_*zig 6

system()函数不一定是线程安全的。

POSIX.1-2008 指定(以及 POSIX.1-2001):

system() 函数不需要是线程安全的。

例如,Solaris 10 文档system()为 thread-unsafe

system() 函数操作 SIGINT、SIGQUIT 和 SIGCHLD 的信号处理程序。因此,在多线程进程中调用 system() 是不安全的,因为操作这些信号处理程序的其他线程和同时调用 system() 的线程可能会以破坏性的方式相互干扰。

该手册页还建议popen()作为线程安全的解决方法。请注意,popen()这不会更改任何信号处理程序。

在 Linux 上,system()是线程安全的

请注意,system()不一定调用fork(). 一个实现可以使用vfork(), 代替。或者,在 Linux 上,它可以直接调用clone(). 它甚至可以使用posix_spawn().

尽管在多线程程序中fork可能具有挑战性,但是直接跟在 exec 之后的 fork 是安全的,通常(模打开文件描述符)。


cdl*_*ard 3

fork在线程程序中是危险的,除非后面跟着execve. 由于只有当前线程被分叉,因此在分叉的多线程程序中除了execve. 您可能应该确保在fork.

既然system()fork+ exec,它应该是安全的。

  • 这是不安全的。文件描述符可能泄漏 (2认同)