问题 是否应该关闭使用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)

4619
2018-02-01 14:55


起源



答案:


您可能不应该使用命名管道来捕获MATLAB中的系统输出。每 MATLAB的 system() 文件,你可以直接捕获输出 system() 呼叫:

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

但是,如果您坚持使用命名管道,那么您应该关闭它。你应该 总是 关闭你打开的资源。但是关闭一个命名管道    删除它。


1
2018-03-15 15:58





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

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

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

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

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

10
2018-02-01 15:04



这个答案是对的。 1:程序的确如此 需要 关闭管道。如果坏程序没有关闭文件,即使工作站也会耗尽打开的文件。 2:你 不要 通过删除它来关闭命名管道。关闭和删除是不同的操作。 - willkil
你是对的。我已经为后代更新了答案。 - Jeffrey Portouw


答案:


您可能不应该使用命名管道来捕获MATLAB中的系统输出。每 MATLAB的 system() 文件,你可以直接捕获输出 system() 呼叫:

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

但是,如果您坚持使用命名管道,那么您应该关闭它。你应该 总是 关闭你打开的资源。但是关闭一个命名管道    删除它。


1
2018-03-15 15:58





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

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

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

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

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

10
2018-02-01 15:04



这个答案是对的。 1:程序的确如此 需要 关闭管道。如果坏程序没有关闭文件,即使工作站也会耗尽打开的文件。 2:你 不要 通过删除它来关闭命名管道。关闭和删除是不同的操作。 - willkil
你是对的。我已经为后代更新了答案。 - Jeffrey Portouw


不能同意。你关闭它关闭fifo。完成后系统关闭fifo(上面的system()调用)。当fifo关闭时,另一方知道没有更多数据(EOF条件,示例代码中没有明确的EOF检查,但在真实代码中很可能)并且完成。


0
2017-07-28 02:51



“不能同意”什么? - user207421
你能展示用于#2的命令吗? - KAE
我实际上来到这个网站因为对fifos不太了解。但是op预计在关闭它后会删除fifo,而系统则以其他方式工作。就像任何其他文件一样,可以打开并关闭fifo或决定将其删除。这是一个例子: - Arseny
在一个终端: mkfifo fifo  cat - >fifo  在另一个终端: cat fifo  第二个终端从第一个终端接收数据,直到用户按下Ctrl-D关闭fifo。 - Arseny