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

时间:2012-11-20 10:42:26

标签: c linux multithreading fork

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

可能导致什么问题?

3 个答案:

答案 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,所以应该是安全的。