SKi*_*SKi 7 c linux multithreading fork
system()功能是通过使用实现fork(),execve()和wait()功能.我听说这个fork()函数在多线程程序中很危险.那么,这个system()函数在多线程程序中是否也很危险?
它可能导致什么问题?
该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 是安全的,通常(模打开文件描述符)。
fork在线程程序中是危险的,除非后面跟着execve. 由于只有当前线程被分叉,因此在分叉的多线程程序中除了execve. 您可能应该确保在fork.
既然system()是fork+ exec,它应该是安全的。