我正在使用命名管道来捕获另一个程序(Matlab)中的外部程序(wgrib2)的输出。 Matlab代码如下,和 system
访问命令行以生成管道。这是我的问题:
- 我是否必须关闭命名管道
myfifo
我用之后呢?代码运行后似乎仍然存在。
- 如果
myfifo
需要关闭,关闭它的命令是什么?
- 我将在下面多次运行代码示例(> 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)
您可能不应该使用命名管道来捕获MATLAB中的系统输出。每 MATLAB的 system()
文件,你可以直接捕获输出 system()
呼叫:
[status, cmdout] = system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166');
a = cmdout
但是,如果您坚持使用命名管道,那么您应该关闭它。你应该 总是 关闭你打开的资源。但是关闭一个命名管道 不 不 删除它。
- 不会.Unix将所有内容视为文件。命名管道没有什么不同。如果您已经完成使用它,您可能想关闭它,这样您就不会使用命名管道弄乱您的机器,但您不需要关闭它。
编辑反映下面的评论,这是正确的。删除!=关闭。
- 您关闭命名管道的方式与关闭任何文件的方式相同:
fclose(mFifo)
如接受的答案所述,结束不会删除fifo。您可能需要单独执行此操作。
- 重新使用命名管道没有任何问题。但是,由您来了解每次迭代完成读/写操作的时间。一旦从管道中读出所有数据,您可以根据需要再次使用它。
您可能不应该使用命名管道来捕获MATLAB中的系统输出。每 MATLAB的 system()
文件,你可以直接捕获输出 system()
呼叫:
[status, cmdout] = system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166');
a = cmdout
但是,如果您坚持使用命名管道,那么您应该关闭它。你应该 总是 关闭你打开的资源。但是关闭一个命名管道 不 不 删除它。
- 不会.Unix将所有内容视为文件。命名管道没有什么不同。如果您已经完成使用它,您可能想关闭它,这样您就不会使用命名管道弄乱您的机器,但您不需要关闭它。
编辑反映下面的评论,这是正确的。删除!=关闭。
- 您关闭命名管道的方式与关闭任何文件的方式相同:
fclose(mFifo)
如接受的答案所述,结束不会删除fifo。您可能需要单独执行此操作。
- 重新使用命名管道没有任何问题。但是,由您来了解每次迭代完成读/写操作的时间。一旦从管道中读出所有数据,您可以根据需要再次使用它。
不能同意。你关闭它关闭fifo。完成后系统关闭fifo(上面的system()调用)。当fifo关闭时,另一方知道没有更多数据(EOF条件,示例代码中没有明确的EOF检查,但在真实代码中很可能)并且完成。