2013-02-01 30 views
9

我正在使用命名管道捕獲另一個程序(Matlab)中的外部程序(wgrib2)的輸出。 Matlab代碼如下,並且system訪問命令行來製作管道。這裏是我的問題:應該關閉使用mkfifo打開的命名管道,以及如何操作?

  1. 我使用它後必須關閉命名管道myfifo嗎?代碼運行後似乎仍然存在。
  2. 如果需要關閉myfifo,關閉它的命令是什麼?
  3. 我將在下面運行代碼示例多次(> 1000),如果我重新使用命名管道並且直到最後才關閉它,那麼是否可以?
system('mkfifo myfifo');  % Make a named pipe myfifo 
% Call the external program wgrib2 and dump its output to the named pipe myfifo 
system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166 > myfifo &'); 
fid = fopen('myfifo', 'r'); % Open the named pipe 
a = fscanf(fid, '%c');  % Read the output as character 
fclose(fid);     % Close the "file" (myfifo still exists afterward) 

回答

1

您可能不應該使用命名管道來捕獲MATLAB中的系統輸出。每MATLAB's system() documentation,你可以在system()呼叫捕獲直接輸出:

[status, cmdout] = system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166'); 
a = cmdout 

但是,如果你堅持使用命名管道,然後是的,你應該關閉它。您應該打開總是關閉資源。但關閉一個命名管道確實不是刪除它。

9
  1. 的Unix號把一切都像一個文件。命名管道沒有區別。如果你已經完成了使用它,你可能想關閉它,所以你不要用命名管道混淆你的機器,但是你不需要關閉它。

編輯以反映下面的評論,這是正確的。刪除!=關閉。

  • 您關閉命名管道關閉任何文件的方式:
  • fclose(mFifo) 
    

    作爲公認的答案中提到,收盤不會刪除FIFO。您可能需要單獨執行此操作。

    1. 重新使用命名管道沒有任何問題。然而,要知道每次迭代完成讀取/寫入的時間,這取決於您。一旦所有數據都從管道中讀出,您可以隨意多次使用它。
    +1

    這個答案是錯誤的。 1:程序確實需要關閉管道。如果壞的程序不關閉他們的文件,即使工作站也可能用完打開的文件。 2:你**不要**通過刪除命名管道來關閉它。關閉和刪除是不同的操作。 – willkil

    +1

    你是對的。我已經更新了後代的答案。 –

    0

    不能同意。關閉fifo關閉它。系統在完成時關閉fifo(上面的system()調用)。當fifo關閉時,另一方知道沒有更多的數據(EOF條件,在示例代碼中沒有明確的EOF檢查,但它很可能是真實的)並結束。

    +0

    '不能同意'什麼? – EJP

    +0

    你可以顯示命令用於#2嗎? – KAE

    +0

    我其實來到這個網站是因爲對fifos的瞭解不多。但是,在關閉它之後,op預計會刪除fifo,而系統會以其他方式工作。就像其他任何文件一樣,人們可以打開或關閉fifo或決定刪除它。例如: – Arseny

    相關問題