我还没有找到在线使用mkfifo()函数的完整示例。我可以这样做fifo:
mkfifo("file",777)但是当我fopen()这个文件时,Octave就挂起了。从mkfifo对象创建、队列和脱队列字节的正确方法是什么?
我想创建一个内存fifo在八度(磁盘上也很好),并从相同的八度脚本读写它。我的项目是实时运行的,所以我需要一个缓冲区,这样我就可以从相同的Octave脚本中填充和排出。我搜索了一个结果为零的fifo库。即使只是创建一个矢量和推送和弹出将适合我的需要。我自己尝试过,但是我遇到了面向对象的编程设计问题,因为Octave不允许通过引用或指针传递。
发布于 2015-05-13 07:36:31
fifo类可以工作,但只能达到一定的大小。运行以下命令可以找到fifo的最大字节大小:
cat /proc/sys/fs/pipe-max-size
1048576下面是我为内存fifo编写的代码。它相当粗糙,但效果很好:
1; % Prevent Octave from thinking that this is a function file
global fifoCount fifoSamples fifoFiles fifoFids fifoDataType
fifoSamples = zeros(0);
fifoCount = 0;
fifoFiles = cell(1);
fifoFids = zeros(0);
fifoDataType = 'single';
fifoDataTypeSize = 4;
fifoMaxBytes = 1048576; % this is operating system enforced, changing here will not help
function [] = o_fifo_write(index, data)
global fifoCount fifoSamples fifoFiles fifoFids fifoDataType
wrcount = fwrite(fifoFids(index), data, fifoDataType);
[sz,~] = size(data);
fifoSamples(index) = fifoSamples(index) + sz;
if( sz ~= wrcount )
disp(sprintf('o_fifo_write was given %d samples but wrote %d', sz, wrcount));
end
if( ~iscolumn(data) )
disp('data must be columnar in o_fifo_write');
end
end
function [data] = o_fifo_read(index, count)
global fifoCount fifoSamples fifoFiles fifoFids fifoDataType
[data, rdcount] = fread(fifoFids(index), count, fifoDataType);
[sz,~] = size(data);
fifoSamples(index) = fifoSamples(index) - sz;
if( sz ~= rdcount || sz ~= count )
disp(sprintf('in o_fifo_read %d %d %d should all be the same', sz, rdcount, count));
end
end
function [avail] = o_fifo_avail(index)
global fifoCount fifoSamples fifoFiles fifoFids fifoDataType
avail = fifoSamples(index);
end
function index = o_fifo_new()
global fifoCount fifoSamples fifoFiles fifoFids fifoDataType
fifoCount = fifoCount + 1;
index = fifoCount;
fifoSamples(index) = 0;
fifoFiles{index} = tempname;
[ERR, MSG] = mkfifo(fifoFiles{index}, base2dec('744',8));
fifoFids(index) = fopen(fifoFiles{index}, 'a+');
% fcntl(fifoFids(index), F_SETFL, O_NONBLOCK); % uncomment to avoid hangs when trying to overfill fifo
end
% ---- usage -----
txfifo = o_fifo_new();
disp(o_fifo_avail(txfifo));
o_fifo_write(txfifo, [1.243 pi 2*pi 4/3*pi]');
disp(o_fifo_avail(txfifo));
disp(o_fifo_read(txfifo, 4));
disp(o_fifo_avail(txfifo));发布于 2015-05-08 07:33:39
有两个问题。第一: mkfifo期望模式为以10为基数的整数,如果以八进制表示"777“,则以8为基数。第二: mkfifo使用umask修改对(mode & ~umask)的权限(请参见man 3)。
例如:
fn=tempname
[ERR, MSG] = mkfifo (fn, base2dec("744", 8))
stat(fn)
fn = /tmp/oct-83UCBR
ERR = 0
MSG =
ans =
scalar structure containing the fields:
dev = 2053
ino = 3408172
mode = 4580
modestr = prwxr--r--
nlink = 1
uid = 1000
gid = 1000
rdev = 0
size = 0
atime = 1.4311e+09
mtime = 1.4311e+09
ctime = 1.4311e+09
blksize = 4096
blocks = 0正如您所看到的,谦逊现在是prwxr--正如您所预期的八进制744。
现在您可以打开FIFO的一端:
fid = fopen (fn, "r")当然,这会阻塞,直到fifo的另一端连接起来。
https://stackoverflow.com/questions/30110340
复制相似问题