system()
功能是使用fork()
,execve()
和wait()
函数实现的。
我听说fork()
函数在多线程程序中很危险。
那么,system()
函数在多线程程序中是否也很危险?
可能导致什么问题?
答案 0 :(得分:3)
system()
函数不一定是线程安全的。
POSIX.1-2008 specifies(以及POSIX.1-2001):
system()函数不一定是线程安全的。
例如,Solaris 10 documents system()
as thread-unsafe:
system()函数操纵信号处理程序 SIGINT,SIGQUIT和SIGCHLD。因此,这是不安全的 在多线程进程中调用system(),因为其他一些 操纵这些信号处理程序和线程的线程 同时调用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后面直接跟一个exec是安全的,一般来说(模数打开文件描述符)。
答案 1 :(得分:1)
Fork在多线程程序中很危险,因为它不会复制所有正在运行的线程。对系统来说应该没问题,但是如果你有信号处理程序和多个线程等待(),你可能会再次陷入困境。
答案 2 :(得分:1)
fork
在线程程序中是危险的,除非后跟execve
。由于只有当前线程被分叉,因此除execve
之外的分叉多线程程序中你可以做的很少。您应该确保在fork
之后没有锁定。
由于system()
执行fork
+ exec
,所以应该是安全的。