2014-08-30 117 views
1

我正在使用命名管道(fifo)在python和MATLAB之間進行通信。從管道讀取的MATLAB代碼是可用的,但如果沒有寫入FIFO,它將掛起。我寧願在沒有數據可用時正常超時。Matlab從FIFO讀取fopen超時

如果管道存在(在bash):

$ mkfifo pipe_read 

,但沒有數據的MATLAB打開命令:

>> fid = fopen('pipe_read', 'r'); 

掛起,直到可用數據:

$ echo "test data" >> pipe_read 

而不是永遠阻止我想fopen返回指示錯誤的文件ID(即,如果沒有可用的數據,則與文件不存在時的-1一樣)。

有沒有類似於寫入和讀取串行儀器命令中提供的異步讀取的解決方案:http://www.mathworks.com/help/matlab/ref/readasync.html

或可能fopen可以嵌入到一個matlab定時器對象,使超時?

這已被問過,但沒有一個答案: Matlab read from named pipe (fifo)

+0

我綁定重現在Windows上的行爲,是'fopen'已經凍結?我期望'fread'和類似的凍結。函數'readasync'與串口有關,除非你使用java,我不知道在matlab中讀取/寫入asynchron文件的可能性。 – Daniel 2014-08-30 15:09:13

+0

@Daniel:謝謝,我正在使用Mac OSX。 'fopen'凍結,以至於我甚至沒有找到'fscanf'或'fread'。 – ljk07 2014-08-30 16:01:02

回答

2

我敢肯定,這個問題實際上不是與Matlab的fopen,但底層open系統調用。通常情況下,只有當讀寫器同時存在時,使用管道或FIFO纔有意義,因此,默認情況下,open(2)將會阻塞,直到FIFO的另一端也被打開。

我不認爲它會在任何其他Matlab對象中嵌入fopen調用。據我所知,解決這個問題的唯一方法是編寫自己的fopen版本,作爲專門的Mex函數。在這種情況下,您可以撥打open(2)O_NONBLOCK標誌爲or'd,並帶有任何您想要的讀/寫標誌。但在man 2 open周圍挖,下ERRORS部分,你可以看到,如果「O_NONBLOCKO_WRONLY設置,該文件是一個FIFO,並沒有進程打開它讀」那ENXIO返回。這意味着你需要確保Python已經打開了讀取的FIFO,然後 Matlab試圖打開寫入(反之亦然)。

作爲最後一點,請記住,Matlab的fopen返回文件描述符的句柄。你的Mex函數應該可以反映這一點,所以你可以將它傳遞給fread/fscanf/etc,沒有問題。