线程安全并发调用外部命令在c++中
Thread-Safe Concurrent call to external command in c++
我一直在互联网上寻找一种方法,试图从我的c++程序中以线程安全的方式并发调用外部程序。据我所知,popen、system和fork都不是线程安全的。在我看来,这里好像少了什么东西,而我到目前为止还没能找到。是否有可能没有办法从不同的线程并发调用到外部程序?因为在我看来,这将是使用多线程编码的第一个例子之一。我使用linux (mandriva)和外部程序,我希望调用可以调用在不同的shell在同一时间。我对c++并不陌生,但我对多线程很陌生,所以我会非常感谢任何关于这个主题的建议。马塞洛
fork()
是线程安全的,只要您只在子进程中执行异步信号安全操作(如execve()
和_exit()
),并且只使用显式pid调用waitpid()
,以避免从程序的另一部分"窃取"僵尸。(请注意,您可能会试图违反前一个要求,但这往往是不可移植和脆弱的。pthread_atfork()
接口基本上是被设计破坏的。)
popen()
也是线程安全的,满足上述两个要求。
system()
可能不是线程安全的,例如,因为它操作信号配置。
是什么让你认为popen, system和fork是线程不安全的?引用自fork的手册页:
子进程是用一个线程创建的调用fork()。父节点的整个虚拟地址空间为在子进程中复制,包括互斥体的状态,条件变量和其他pthreads对象;的使用Pthread_atfork(3)可能有助于处理这类问题会引起.
如果你调用system,你的线程将阻塞,直到子进程退出。如果你想并行启动多个外部命令,你可以启动10个调用system的线程。
除了其他答案之外,由于您在Linux上,您可以只使用d-bus和请求/响应协议。也就是说,你的线程只需发送d-bus请求消息,而不必关心同步,并以同步或异步的方式接收响应。
D-Bus是一个消息总线系统,是应用程序相互通信的一种简单方式。除了进程间通信之外,D-Bus还有助于协调进程生命周期;它使编写"单实例"应用程序或守护进程变得简单可靠,并在需要它们的服务时按需启动应用程序和守护进程。
- 从命令行c++发送文本文件名
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 使用QProcess执行命令,并将结果存储在QStringList中
- 数组长度,为什么从命令行获取时不能使用它?
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- clang整洁10忽略了我的NOLINT命令
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- VS Code "command":"make"与终端窗口中的命令行"make"不同
- 使用VS Code和CMake Tools运行自定义命令
- 如何使用ESP8266向谷歌主页发送命令
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 通过 Openssl 命令行加密,通过 c++ 解密
- CMake "--target install"无需"--build"命令行
- Gstreamer 管道从命令 lne 到 c 代码
- 自动"yes"到 Popen SSH 命令
- 更改命令行 qt5 源代码构建配置的正确/快速方法