我有两个通过命名管道(使用 mkfifo() 生成)进行通信的 C++ 程序。
一段时间后,写作程序挂起。我认为 FIFO 的缓冲区已满。如果缓冲区已满,是否可以在写入 FIFO 之前进行检查?
提前致谢!
鲁本
我有两个通过命名管道(使用 mkfifo() 生成)进行通信的 C++ 程序。
一段时间后,写作程序挂起。我认为 FIFO 的缓冲区已满。如果缓冲区已满,是否可以在写入 FIFO 之前进行检查?
提前致谢!
鲁本
我担心O_NONBLOCK写入命名的fifo会导致linux上的内存不足问题:
我做了一个小实验,会发生什么,当作家进程......
SIGPIPE) 的过程信号设置为忽略,O_NONBLOCK 这实际上是将此处发布的 ftee-program的想法集成到 writer 程序本身中。
另一方面,我会在一段时间后将命名 fifo 的内容读出到一个文件中并检查它 - 因此我的意思是“在编写器进程产生了超过 64K 的数据之后”。
结果是,该文件包含编写器进程的所有输出 - 这证明了超过 64K 已被 linux 缓冲。
这向我提出了一些问题:
背景: - 那是我的作家计划writer.pl:
#!/usr/bin/perl -w
use strict;
use Fcntl;
my $fifo_name = '/tmp/fifo1';
sub daemon()
{
    my $pid = fork();
    if ($pid < 0) { die "fork(): $! \r\n"; }    
    if ($pid > 0) { exit(0); }
    close(STDIN);
    close(STDOUT);
}
sub main()
{
    `mkfifo $fifo_name`;
    $SIG{'PIPE'}    = "IGNORE"; # ignoring SIGPIPE
    my $fifo_fh = undef;
    sysopen($fifo_fh, $fifo_name, O_NONBLOCK | O_RDWR) or die $!;
    my $n = 0;
    while (1)
    {
        my $line = "This is line $n...\n";
        syswrite($fifo_fh, $line, length($line));
        select(undef, undef, undef, 0.01); # sleep 1/100 second
        $n++;
    }
}
daemon();
main();
...这就是我测试的:
$ ./writer.pl
... 稍等片刻 ...
$ cat /tmp/fifo1 > dump.txt
...因为这永远不会终止,请在一段时间后按 Ctrl-C,然后
$ less dump.txt
This is line 0...
This is line 1...
This is line 2...
...
This is line 61014...
This is line 61015...
writer.pl 从一开始的所有输出都存储在某个地方!