管道PIPE BUF說明

2021-08-20 19:22:52 字數 1776 閱讀 2467

管道pipe_buf說明

fifo被稱為命名管道。pipe也是管道。

由於pipe和fifo本質上都是管道,不同點就是建立方式不一樣、fifo多個程序使用(可以沒有共同祖先)、fifo多個程序通訊。因此,fifo的測試demo就不多介紹了。本部落格主要記錄管道的pipe_buf,即管道的快取大小。

posix.1規定當寫入管道的長度小於pipe_buf位元組時必須是原子的:即寫入資料作為連續序列寫入管道。 超過pipe_buf位元組的寫入可能是非原子的:核心可能會將資料與其他程序寫入的資料交錯。 posix.1要求pipe_buf至少為512位元組。(在linux上,pipe_buf為4096位元組)。在實踐中取決於檔案描述符是否為非阻塞(o_nonblock),管道中是否有多個寫入器,以及n要寫入的位元組數:

情況1:o_nonblock disabled, n <= pipe_buf

所有n個位元組都以原子方式寫入; write可能會阻止如果沒有空間來立即寫入n個位元組。

情況2:o_nonblock enabled, n <= pipe_buf

如果有空間向管道寫入n個位元組,則立即write成功,寫入全部n個位元組; 否則失敗,並將errno設定為eagain。

情況3:o_nonblock disabled, n > pipe_buf

寫入是非原子化的:write的資料可能會被寫入(2)與其他程序交錯; write阻塞,直到寫入了n個位元組。

情況4:o_nonblock enabled, n > pipe_buf

如果管道已滿,則寫入(2)失敗,並將errno設定為eagain。 否則,可能會寫入1到n個位元組(即可能發生「部分寫入」;呼叫者應該檢查write(2)的返回值以檢視實際寫入的位元組數),並且可以將這些位元組與其他程序寫入。

使用linux的ulimit -a來檢視系統限制:

core file size          (blocks, -c) 0

data seg size (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 3777

max locked memory (kbytes, -l) 64

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

posix message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 8192

cpu time (seconds, -t) unlimited

max user processes (-u) 3777

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

可以看到在linux系統上pipe size 為512bytes * 8= 4096bytes。

[1].

命名管道簡單說明

與共享記憶體作用一樣,都是為了多程序對同一塊資訊進行讀寫操作 服務端 include stdafx.h include include include using namespace std intmain cout create pipe success endl 等待客戶端連線if connec...

彎頭lisp 管道材料代號說明

ll 空格空格 空格長度 空格空格 空格空格 空格空格 隔環空格 空格空格 空格空格 空格代號 空格空格 空格空格 空格空格 名稱附表號 環槽面單盲板 16 盲板 隔環 r2019 金屬墊片 全平面管法蘭用 garf 表18.1 代號r20 i凸檯面管法蘭用 i墊片厚度代號 2.0grvclii 代...

Redis 管道加快Redis 執行速度說明

我在做 timeline 的demo 例項 的訊息推送的時候發現推送的速度怎麼如此之慢大概每秒只處理4千條佇列 如下 後端推送timeline 的demo 例項 include once redisdb.class.php rdb new redisdb 192.168.1.252 6379 whi...