2014-02-27 82 views
4

我嘗試通過命名管道建立一些Fortran進程之間的通信。但是,即使考慮到一個非常簡單的玩具例子,我也會遇到麻煩。這裏是我的代碼:命名管道和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 

我不沒有任何錯誤信息。另外,我嘗試修改格式爲< - > unformatted的打開語句,錯誤處理等錯誤= 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
克++ 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

+0

什麼是應該做的'年底program'前'return'的stream訪問?它在主程序中是不允許的,許多編譯器會發出錯誤。也沒有明智的理由。 –

+0

美元符號也是可疑的,它實際上是在第6列嗎? –

+0

我被告知,如果沒有返回,管道可能無法正確關閉。 $符號是換行符。我以前從來沒有遇到過麻煩。如果沒有換行符,我會成爲編譯錯誤。刪除退貨不會導致任何更改。 – user3240157

回答

3

這對我的作品。不知何故,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

+0

非常感謝,它也適用於我:) – user3240157