[英]Named Pipe in C++ Linux check if buffer is full
我有兩個通過命名管道進行通信的C ++程序(由mkfifo()生成)。
一段時間后,編寫程序掛起。 我認為FIFO的緩沖區已滿。 是否可以在寫入FIFO之前檢查緩沖區是否已滿?
提前致謝!
魯本
恐怕O_NONBLOCK
寫入命名的fifo會導致linux內存不足的問題:
我做了一個小實驗,當編寫程序時會發生什么...
SIGPIPE
)設置為忽略, O_NONBLOCK
打開一個命名管道 這實際上是將在此處發布的ftee程序的思想整合到writer程序本身中。
另一方面,我將在相當長的一段時間后將命名的fifo的內容讀出到文件中並進行檢查-因此,我的意思是“在編寫器進程產生了超過64K的數據之后”。
結果是該文件包含writer進程的所有輸出-這證明linux已經緩沖了64K以上的方式。
這給我提出了一些問題:
背景:-這是我的作家程序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的所有輸出都存儲在某個地方!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.