从C+启动程序+;,与管道交换信息,然后共享内存 我目前正在开发一个使用C++C++共享内存的模块化框架。 我们的目标是在C和C++中都有独立的程序,通过共享内存互相交谈。

从C+启动程序+;,与管道交换信息,然后共享内存 我目前正在开发一个使用C++C++共享内存的模块化框架。 我们的目标是在C和C++中都有独立的程序,通过共享内存互相交谈。,c++,pipe,shared-memory,popen,C++,Pipe,Shared Memory,Popen,例如,一个程序负责读取GPS,另一个程序负责处理来自多个传感器的数据 主程序将启动所有从程序 (目前我正在使用fp=popen(./slave1/slave1,“r”);来实现这一点),然后创建每个从机都可以连接的共享内存段。 其背后的思想是,如果从机死亡,它可以由主机恢复,并重新连接到同一共享内存段。 也可以在运行期间交换从属设备(例如,将一个GPS切换到另一个GPS) 问题是我通过popen生成了从机,并将共享内存ID传递给了从机。从机通过管道传回所需的尺寸。 完成此操作后,我希望将从属管道

例如,一个程序负责读取GPS,另一个程序负责处理来自多个传感器的数据

主程序将启动所有从程序 (目前我正在使用
fp=popen(./slave1/slave1,“r”);
来实现这一点),然后创建每个从机都可以连接的共享内存段。 其背后的思想是,如果从机死亡,它可以由主机恢复,并重新连接到同一共享内存段。
也可以在运行期间交换从属设备(例如,将一个GPS切换到另一个GPS)

问题是我通过popen生成了从机,并将共享内存ID传递给了从机。从机通过管道传回所需的尺寸。 完成此操作后,我希望将从属管道重新路由到终端,以显示调试消息,而不是通过主管道

我们非常感谢各位提出的建议以及解决这一问题的其他办法。
关键是在设置共享内存之前进行某种形式的交流。

我建议使用另一种方式进行交流。命名管道是我认为的方式。标准输出/错误的重新路由充其量也很棘手

我建议使用boost.interprocess来处理IPC。并注意同步:)


my2c要解决特定问题,请将调试消息发送到stderr,而不是stdout。

您可能需要查看unix域套接字的传输模式-这允许您通过本地套接字传递文件描述符。这可用于将stderr等传递给从属进程

您还可以将共享内存段作为文件描述符传递(至少在Linux上是这样)。在
/dev/shm
中创建一个随机名称的文件,并立即取消链接。现在
ftruncate
到所需的大小,并
mmap
MAP\u共享
。现在您有了一个绑定到文件描述符的共享内存段。这种方法的一个优点是,如果持有共享内存段的所有进程都终止,共享内存段将自动销毁


把这些放在一起,您可以将您的从机传递到unix域的一端
socketpair()
。只需在exec上保持fd打开,并在命令行上传递fd编号。通过套接字对将所需的任何配置信息作为常规数据传递,然后移交一个指向共享内存段的文件描述符。

管道不可重新运行--它们在创建时会转到它们所在的位置。您需要做的是让从属服务器在处理完管道后关闭它,然后在其他地方重新打开它的标准输出。如果你总是希望输出到终端,你可以使用
freopen(“/dev/tty”,“w”,stdout)
,但是它总是会到终端——你不能将它重定向到其他任何地方。

来吧-如果你控制两端,管道很容易重新运行-
dup2()
SCM\u权限
都是你的朋友这也会起作用,由于共享内存段启动后不再需要通过管道进行通信。在更改为终端输出之前,您是否仍建议使用popen()启动从属程序并设置管道?@bdonian:这些不会重新路由管道——它们只是复制文件描述符。正如OP所要求的那样,无法将管道的一端转换为设备描述符。@kristofer:popen/pclose是fork/exec的一个很好的包装器,如果您只想在您的程序和您调用的其他程序之间有一个单向管道的话。如果你想要双向通信,POPON通常是不充分的。Boo..Pr.Pro看起来很不错,但这只在C++ C++中运行。当你把你的问题标记为C++…是的,这是一个精心制作的库:)应该提到的是,这是一个Linux系统。