system()
函数是通过使用fork()
,execve()
和wait()
函数实现的。我听说这个fork()
函数在多线程程序中很危险。那么,该system()
函数在多线程程序中是否也很危险?
它可能会导致什么问题?
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()
.
尽管在多线程程序中分叉可能具有挑战性,但通常情况下,直接跟在 exec 之后的分叉是安全的(以打开文件描述符为模)。
fork
在线程程序中是危险的,除非后面跟着execve
. 由于只有当前线程是分叉的,所以在分叉的多线程程序中除了execve
. 您可能应该确保在fork
.
既然system()
做fork
+ exec
,它应该是安全的。
Fork 在多线程程序中很危险,因为它不会复制所有正在运行的线程。系统应该没问题,但是如果您有信号处理程序和多个线程等待(),您可能会再次陷入混乱。