簡體   English   中英

C ++ Linux中的命名管道檢查緩沖區是否已滿

[英]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以上的方式。

這給我提出了一些問題:

  • 除了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的所有輸出都存儲在某個地方!

pipe手冊頁

如果某個進程嘗試寫入一個已滿的管道(請參見下文),則write(2)會阻塞,直到從管道中讀取了足夠的數據以允許寫入完成為止。

解決方案是打開指定O_NONBLOCK標志的管道(請參見open手冊頁 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM