这是我的问题 - 我有一个多线程(pthreads)C ++应用程序,其中我有一个主控制循环线程和3个数据采集线程(一个串行端口读取器/写入器和两个TCP套接字连接线程)。在程序期间的某些时刻,我需要执行shell脚本。我做了一些研究,看到system()
是一个选项。备选方案似乎表明使用了fork()
和exec()
系列函数。
我预计的问题是fork()
的使用会导致我的进程被复制,显然这将导致我的通信线程运行无问题。由于system()
文档表明它在幕后使用fork()
,这也意味着我无法使用它。
我不知道如何继续。有这种问题的最佳实践方法吗?我可以看到继续进行的唯一可行方法是尝试在C ++代码中直接创建我需要运行的shell脚本的功能。显然,要求这样做的工时是最不可取的选择。我还可以考虑其他任何选择吗?
答案 0 :(得分:3)
我预计的问题是fork()的使用会导致我的进程被复制,显然这将导致我的通信线程运行无问题。
fork()
实际上只复制调用线程。来自man fork
:
请注意以下几点:
使用单个线程创建子进程 - 调用fork()的线程。整个虚拟 父节点的地址空间在子节点中复制,包括互斥锁状态,条件 变量和其他pthreads对象;使用pthread_atfork(3)可能有助于处理 这可能会导致问题。
即。将不会有一整套新的重复工作线程在后台造成严重破坏。这由POSIX规定。只是不要触摸互斥锁等。system()
在fork内部做的第一件事是调用exec()
,所以这不是问题。自己使用它或自己做fork的选择取决于你是否要等待子进程完成,或者只是启动它并继续运行。