我有一个用 C++ 编写的程序。有一个用 Python 编写的脚本(使用哪种语言并不重要)。有必要将这些程序的进程之间的数据传输正式化。具有 GNU/Linux 内核的操作系统。
我看到了不同的选项,但基本上 Python 始终充当启动 C++ 程序进程的启动应用程序。C++ 进程运行 Python 脚本需要相反的过程。
希望该方法是通用的,即可以用另一种语言编写脚本并使用相同的方法与其交换数据。
我有一个用 C++ 编写的程序。有一个用 Python 编写的脚本(使用哪种语言并不重要)。有必要将这些程序的进程之间的数据传输正式化。具有 GNU/Linux 内核的操作系统。
我看到了不同的选项,但基本上 Python 始终充当启动 C++ 程序进程的启动应用程序。C++ 进程运行 Python 脚本需要相反的过程。
希望该方法是通用的,即可以用另一种语言编写脚本并使用相同的方法与其交换数据。
如果你想在 Linux 中与 C / C ++ 程序的脚本交换消息,就像你坐在终端前一样(即如果脚本读取标准输入并写入标准输出),那么你可以使用这个功能
类似于popen ,它返回
FILE *与伪终端相关联,在伪终端上,具有给定参数的脚本(程序)在新进程中启动。带有脚本的文件的名称及其参数的传递方式与execvp函数中的方式相同(只有脚本的第一个参数被用作要启动的文件的名称)。
child此进程的 pid 位于参数中的地址。您需要使用 -lutil 选项进行构建(请参阅man forkpty)。
这是一个(有点麻烦和人为的)使用示例
ls -l *.txt | grep 20当我们事先不知道grep对传递的字符串的响应是什么时,此示例给出的结果与显示使用 popen 和 pty_exec 的结果相同。fd_out()请注意程序末尾的调用超时。实际上,有多种实施方案。命名管道(named pipes)就是为了我的任务而产生的。
下面显示了一个实现示例。省略了一些错误处理并且简化了代码本身。
C++ 的代码片段
Python 的代码片段
用 C++ 编写的程序的进程首先开始,因为它创建频道文件。
从你关于信号的问题来看,我会简化进程通信,例如,你可以在 Python 中使用标准输入/输出进行写入和读取:
要在 之后将子进程的 I/O 重定向到 C
fork(),您可以dup2()使用. 或者更简单,使用socketpair. 如果需要,您可以使用共享内存 (mmap,posix_ipc)。