是否应该关闭用mkfifo打开的命名管道?

KAE*_*KAE 13 pipe mkfifo

我正在使用命名管道来捕获另一个程序(Matlab)中的外部程序(wgrib2)的输出.Matlab代码如下所示,并system访问命令行以生成管道.这是我的问题:

  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)
Run Code Online (Sandbox Code Playgroud)

Jef*_*ouw 10

  1. 不会.Unix将所有内容视为文件.命名管道没有什么不同.如果您已经完成使用它,您可能想关闭它,这样您就不会使用命名管道弄乱您的机器,但您不需要关闭它.

编辑反映下面的评论,这是正确的.删除!=关闭.

  1. 您关闭命名管道的方式与关闭任何文件的方式相同:
    fclose(mFifo)
Run Code Online (Sandbox Code Playgroud)

如接受的答案所述,关闭不会删除fifo.您可能需要单独执行此操作.

  1. 重新使用命名管道没有任何问题.但是,您可以知道每次迭代完成读/写操作的时间.一旦从管道中读出所有数据,您可以根据需要再次使用它.

  • 这个答案是错误的。1:程序确实*需要*关闭管道。如果坏程序不关闭它们的文件,即使是工作站也可能用完打开的文件。2:您**不要**通过删除命名管道来关闭它。关闭和删除是不同的操作。 (3认同)

wil*_*kil 1

您可能不应该在 MATLAB 中使用命名管道来捕获系统输出。根据MA​​TLAB 的system()文档,您可以直接在调用中捕获输出system()

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

但是,如果您坚持使用命名管道,那么是的,您应该关闭它。您应该始终关闭打开的资源。但关闭命名管道并不会删除 它。