带有命名管道的 IPC:复兴遗留代码

问题描述

我正在 Fortran2003 中开发一个代码,该代码在很大程度上依赖于一个用 Fortran77 编写的大型、复杂且非常高效的遗留程序的输出。对于新项目的未来发展,旧程序在新程序启动之前不要通过生成文件来传递数据,而是根据来自新程序的查询实时按需提供数据,这将是有用的。程序。在我见过的所有各种 IPC 机制中,似乎命名管道是最容易实现的,这可以使用 Fortran 内在特性来完成,而且速度也相当快(当然比通过真实文件进行通信要快得多! )

我用两个在流访问中打开同一个 fifo 的可执行文件测试了这个想法,看起来它工作正常:

program Proc1

  implicit none

  character(len=*),parameter :: DATA_FIFO ="data.fifo"
  integer            :: i,data_uid
  integer,parameter :: N = 100000000
  real(kind(1d0))    :: mat(N)

  open(newunit=data_uid,file=DATA_FIFO,access="stream")
  mat=1.d0
  write(*,*) "sending data",sum(mat)
  write(data_uid) (mat(i),i=1,N)
  close(data_uid)

end program Proc1
program Proc2
  
  implicit none

  character(len=*),access="stream")
  read(data_uid) (mat(i),N)
  write(*,*)"data received",sum(mat)
  close(data_uid)

end program Proc2

在实际情况下,我会修改遗留代码,使其成为能够侦听指令管道并将信息读/写到使用新程序打开的数据管道的“恶魔”。当新程序扩展到分布式内存时,每个节点都可以有自己的恶魔。然而,在继续之前,我想就这个方案是否是一个有效的想法得到反馈。如果答案是肯定的,是否有针对此问题的标准实现(即,传统 Fortran 代码间的 IPC 临时转换为服务器,以及应该并行的新 Fortran 代码)?如果答案是否定的,那么什么是更有效的解决方案,既可以足够通用又不会变得非常复杂(内存共享对我来说看起来很棘手)? 非常感谢您的想法。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)