9

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

它可能会导致什么问题?

4

3 回答 3

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().

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

于 2017-11-02T12:07:14.773 回答
3

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

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

于 2012-11-20T10:49:26.850 回答
1

Fork 在多线程程序中很危险,因为它不会复制所有正在运行的线程。系统应该没问题,但是如果您有信号处理程序和多个线程等待(),您可能会再次陷入混乱。

于 2012-11-20T10:44:10.237 回答