【问题标题】:Trouble with named pipes and fortran命名管道和fortran的问题
【发布时间】:2014-03-31 06:01:39
【问题描述】:

我尝试通过命名管道在一些 fortran 进程之间建立通信。但是,即使考虑到一个非常简单的玩具示例,我也会遇到麻烦。这是我的代码:

  program testfifo

  implicit none

  integer status

  write(*,*) "hello"
  call flush()

  open(unit=11,file="MyNamedPipe",action='write',form ='unformatted'
 $     ,iostat=status);
  close(11)

  write(*,*) "by"
  call flush()

  return
  end program testfifo    

如果我使用普通文件运行它,它可以工作:

/fortran > rm -f MyNamedPipe && touch MyNamedPipe
/fortran > gfortran -o testfifo testfifo.f 
/fortran > ./testfifo 
 hello
 by

但是,使用 fifo 运行我的程序会卡住:

/fortran > rm -f MyNamedPipe && mkfifo MyNamedPipe
/fortran > gfortran -o testfifo testfifo.f 
/fortran > ./testfifo 
 hello
^C

我没有收到任何错误消息。此外,我尝试更改格式化为 未格式化的 open 语句,使用 err=100 进行错误处理等,但没有帮助。以下是我的一些系统统计数据:

Linux lin45 3.2.0-4-amd64 #1 SMP Debian 3.2.54-2 x86_64 GNU/Linux
gfortran 4.6.2
gcc 4.6.2
g++ 4.6.2

我在网上搜索这个问题的解决方案已经有一段时间了。如果有人可以帮助我,我会非常高兴。此外,如果有人能够毫无问题地运行代码,如果这可能是由于任何系统/编译器问题,我会很感兴趣。谢谢。

注意:我真正感兴趣的程序需要在#n 个进程之间进行通信,因此,我认为我不能使用普通管道。此外,已经有一个使用管道设置的代码版本。但是,它只能在 Mac 上运行。我的任务是在 Linux 下运行它。 Mac 规格为:

Mac OS X 10.7.5
Xcode 4.5
gfortran 4.6.1
gcc 4.2.1
g++ 4.2.1

【问题讨论】:

  • return 之前的end program 应该做什么?在主程序中是不允许的,许多编译器会抛出错误。也没有合理的理由。
  • 美元符号也很可疑,真的在第6列吗?
  • 有人告诉我,如果没有返回,管道可能无法正确关闭。 $ 符号是换行符。我以前从来没有遇到过这个问题。如果没有换行符,我将成为编译错误。删除退货不会导致任何更改。
  • 如果我将 open 语句写在一行中,我会得到:code /fortran > gfortran -o testfifo testfifo.f testfifo.f:12.67: open(unit=110,file="MyNamedPipe",action='write',err=100,form='unfo 1 Error: Invalid value for FORM specification at (1)
  • 你肯定被告知错了,return 它不能被我的 3 个编译器中的 2 个编译。当我启用严格的标准一致性时,甚至不使用 gfortran。

标签: linux fortran named-pipes gfortran


【解决方案1】:

这对我有用。不知何故,action="write" 有问题。

    program testfifo

    implicit none

    integer status

    write(*,*) "hello"
    call flush()

    open(unit=11,file="MyNamedPipe",access='stream'                    &
 &   ,form ='unformatted', iostat=status)
    write(11) status
    print *, status
    close(11)

    write(*,*) "by"
    call flush()

    end program testfifo  

因为http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30162,我使用了stream访问

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 2016-03-30
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多