如何从多线程C ++ Linux应用程序安全地运行shell脚本?

时间:2014-07-07 13:46:52

标签: linux multithreading pthreads fork

这是我的问题 - 我有一个多线程(pthreads)C ++应用程序,其中我有一个主控制循环线程和3个数据采集线程(一个串行端口读取器/写入器和两个TCP套接字连接线程)。在程序期间的某些时刻,我需要执行shell脚本。我做了一些研究,看到system()是一个选项。备选方案似乎表明使用了fork()exec()系列函数。

我预计的问题是fork()的使用会导致我的进程被复制,显然这将导致我的通信线程运行无问题。由于system()文档表明它在幕后使用fork(),这也意味着我无法使用它。

我不知道如何继续。有这种问题的最佳实践方法吗?我可以看到继续进行的唯一可行方法是尝试在C ++代码中直接创建我需要运行的shell脚本的功能。显然,要求这样做的工时是最不可取的选择。我还可以考虑其他任何选择吗?

1 个答案:

答案 0 :(得分:3)

  

我预计的问题是fork()的使用会导致我的进程被复制,显然这将导致我的通信线程运行无问题。

fork()实际上只复制调用线程。来自man fork

  

请注意以下几点:

     

使用单个线程创建子进程 - 调用fork()的线程。整个虚拟             父节点的地址空间在子节点中复制,包括互斥锁状态,条件             变量和其他pthreads对象;使用pthread_atfork(3)可能有助于处理             这可能会导致问题。

即。将不会有一整套新的重复工作线程在后台造成严重破坏。这由POSIX规定。只是不要触摸互斥锁等。system()在fork内部做的第一件事是调用exec(),所以这不是问题。自己使用它或自己做fork的选择取决于你是否要等待子进程完成,或者只是启动它并继续运行。

相关问题