我正在使用命名管道来捕获另一个程序(Matlab)中的外部程序(wgrib2)的输出。 Matlab代码如下,system
访问命令行来制作管道。以下是我的问题:
myfifo
?代码运行后似乎仍然存在。myfifo
,关闭它的命令是什么?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)
答案 0 :(得分:10)
编辑以反映以下评论,这是正确的。删除!=关闭。
fclose(mFifo)
如接受的答案所述,结束不会删除fifo。您可能需要单独执行此操作。
答案 1 :(得分:1)
您可能不应该使用命名管道来捕获MATLAB中的系统输出。根据{{3}},您可以直接在system()
调用中捕获输出:
[status, cmdout] = system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166');
a = cmdout
但是,如果您坚持使用命名管道,那么是,您应该关闭它。您应始终关闭您打开的资源。但是关闭命名管道 不 将其删除。
答案 2 :(得分:1)
您可能将关闭与 mkfifo
命令的反面混淆了。
公认的答案对于 MATLAB 用户来说绝对是最佳解决方案,但我想为那些为了命名管道来到这里的人澄清一下。
在类 Unix 上,命名管道 (FIFO) 是一种特殊类型的文件,没有内容。 mkfifo
命令在文件系统上创建管道(为其分配一个名称),但不打开它。您需要像任何其他文件一样单独打开和关闭它。
myfifo
后是否必须关闭它?代码运行后它似乎仍然存在。一旦您不再需要它们,就立即关闭/删除/释放它们通常是个好主意。
当管道的所有描述符都关闭时,管道本身(及其内容)将被销毁。你看到的只是一个名字。
myfifo
需要关闭,关闭它的命令是什么?命名管道可以用 fclose()
function 关闭。要使给定名称的管道匿名且不可用(可以在管道仍然打开时完成),您可以使用 MATLAB 的 delete
function 或 rm
控制台命令。
只要每次迭代都以空管道开始,就可以重用命名管道(根据 MATLAB 文档,fscanf()
function 会为您执行此操作)。
命名管道可以通过两种方式重用:
system('mkfifo myfifo');
tmp = fopen('myfifo', 'r+'); % Open the pipe in both ways (otherwise it will block)
fid = fopen('myfifo', 'r'); % Open the pipe for reading (otherwise `fscanf` will block)
fclose(tmp); % Close the auxiliary descriptor
% Use the pipe multiple times...
system('wgrib2.exe multi_1.glo_30m.hs.201212.grb2 -ij 1 165 -ij 1 166 > myfifo');
a = fscanf(fid, '%c');
...
% Close and delete the pipe
fclose(fid);
delete myfifo;
答案 3 :(得分:0)
不能同意。你关闭它关闭fifo。完成后系统关闭fifo(上面的system()调用)。当fifo关闭时,另一方知道没有更多数据(EOF条件,示例代码中没有明确的EOF检查,但在真实的情况下很可能)并且完成。