Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数system()是否可以在线程中调用?_C_Linux_Multithreading - Fatal编程技术网

C 函数system()是否可以在线程中调用?

C 函数system()是否可以在线程中调用?,c,linux,multithreading,C,Linux,Multithreading,我想使用system()执行cmd。 如果cmd需要很长时间(如ping),它将阻塞主线程 所以我想创建一个子线程来处理它。在此子线程中,将调用system() 众所周知,system()将派生一个子进程。 我不确定在子线程中调用system()时是否有任何问题或副作用。system()被Linux/glibc文档标记为线程安全。看。但有一个警告: 根据POSIX.1,未指定处理程序是否已注册 使用pthread_在system()执行期间调用atfork(3)。 在glibc实现中,不调用此类

我想使用
system()
执行cmd。 如果cmd需要很长时间(如
ping
),它将阻塞主线程

所以我想创建一个子线程来处理它。在此子线程中,将调用
system()

众所周知,
system()
将派生一个子进程。 我不确定在子线程中调用
system()
时是否有任何问题或副作用。

system()
被Linux/glibc文档标记为线程安全。看。但有一个警告:

根据POSIX.1,未指定处理程序是否已注册 使用pthread_在system()执行期间调用atfork(3)。 在glibc实现中,不调用此类处理程序

根据您所描述的,您可能没有atfork处理程序,所以这很好

我想使用system()执行cmd。如果cmd像ping一样花费很长时间,它将阻塞主线程

但是,如果使用单独线程的唯一目的是运行命令,为什么不直接
fork(2)
,让它处理exec命令的子进程呢? 主进程仍然可以继续,并且可以检查子进程是否已完成(例如,使用with
WNOHANG
)。
在我看来,这将更干净,并避免了fork+线程的复杂性。

system()
是多线程安全的,快速浏览手册页就会发现。相反,线程是执行此任务的最佳选择。它允许主处理继续,并通过
系统
命令透明地从线程执行分叉。它仍然会创建另一个进程,但不需要使用
fork
。您确切地知道
系统
在做什么(如果您不知道,
man
页面正在描述它-它将
fork
execl
waitpid
)。写下此序列并与程序的其他部分一起分析,确定是否存在这两者可能造成的潜在问题。与您的问题没有直接关系,但如果cmd需要很长时间,如
ping
?在您出于某种原因尝试打开与服务器的TCP连接之前,您实际上不会对服务器执行类似于ping的操作,是吗?“检查X,如果它有效,那么就做Y”几乎总是一个坏主意,因为X并没有真正告诉你Y是否有效。只要做点什么,处理好任何失败——不管怎样,你必须这样做。