(P24)管道 管道的讀寫規則

2021-10-23 17:36:36 字數 4141 閱讀 3633

-當要寫入的資料量小於等於pipe_buf,linux將保證寫入的原子性

原子性:假設a程序和b程序都要向管道寫入資料,a程序寫入的資料量小於等於pipe_buf,則a程序寫入的資料是連續的,中間並不會插入b程序寫入的資料,man 7 pipe看pipe_buf;否則多個程序往管道寫入資料,可能會出現資料穿插的問題,程序a的寫入的資料就不是連續的了,可能會夾雜著b的資料

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define err_exit(m) \

do \

while(0)

intmain

(int argc,

char

*ar**)

close

(pipefd[1]

);char buf[10]

=;read

(pipefd[0]

, buf,10)

;close

(pipefd[1]

);printf

("buf = %s\n"

, buf)

;return0;

}

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define err_exit(m) \

do \

while(0)

intmain

(int argc,

char

*ar**)

close

(pipefd[1]

);char buf[10]

=;//將pipefd[0],設定為非阻塞模式

int flags =

fcntl

(pipefd[0]

, f_gettfl)

;fcntl

(pipefd[0]

, f_setfl, flags | o_nonblock)

;int ret =

read

(pipefd[0]

, buf,10)

;if(ret ==-1

)err_exit

("read error");

close

(pipefd[1]

);printf

("buf = %s\n"

, buf)

;return0;

}

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define err_exit(m) \

do \

while(0)

intmain

(int argc,

char

*ar**)

//關閉父程序的寫端

close

(pipefd[1]

);sleep(1

);char buf[10]

=;int ret =

read

(pipefd[0]

. buf,10)

;printf

("ret = %d \n"

, ret)

;return0;

}

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define err_exit(m) \

do \

while(0)

void

handler

(int sig)

intmain

(int argc,

char

*ar**)

close

(pipefd[0]

);sleep(1

);char buf[10]

=;int ret =

write

(pipefd[1]

,"hello",10

);if(ret ==-1

)printf

("write error\n");

return0;

}

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define err_exit(m) \

do \

while(0)

//測試管道的容量

intmain

(int argc,

char

*ar**)

return0;

}

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define err_exit(m) \

do \

while(0)

//測試管道的容量

intmain

(int argc,

char

*ar**)

count++;}

printf

("count=%d\n"

, count)

;return0;

}

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define err_exit(m) \

do \

while(0)

//pipe_buf是4kb,用大於》4k 就行了,但是不容易測出穿插情況

//所以用了68k

//68kb

#define test_size 68*1024

intmain

(int argc,

char

*ar**)

pid =

fork()

;//子程序b

if(pid ==0)

//初始的父程序,接收程序a和程序b的資料

close

(pipefd[1]

);sleep(1

);int fd =

open

("test.txt"

, o_wrpnly | o_creat| o_trunc,

0644);

char buf[

1024*4

]=;int n =1;

while(1

)return0;

}

.phony:clean all

cc=gcc

cflags=

-wall -g

bin=

01pipe

all:$(bin)

%.o:%.c

$(cc) $(cflags)

-c $<

-o $@

clean:

rm -f *

.o $(bin)

Linux命名管道FIFO的讀寫規則

1.從fifo中讀取資料 約定 如果乙個程序為了從 fifo 中讀取資料而阻塞開啟了 fifo 那麼稱該程序內的讀操作為設定了阻塞標誌的讀操作。1 如果有程序寫開啟fifo,且當前fifo為空,則對於設定了阻塞標誌的讀操作來說,將一直阻塞下去,直到有資料可以讀時才繼續執行 對於沒有設定阻塞標誌的讀操...

Linux命名管道FIFO的讀寫規則

linux 程式設計 第 3版 對於 linux 命名管道的讀寫規則詳解的不夠詳細和清楚,查了些資料,在此總結一下 1.從fifo 中讀取資料 約定 如果乙個程序為了從 fifo 中讀取資料而阻塞開啟了 fifo 那麼稱該程序內的讀操作為設定了阻塞標誌的讀操作。1 如果有程序寫開啟 fifo 且當前...

有名管道的開啟規則

2.3 有名管道的開啟規則 有名管道比管道多了乙個開啟操作 open。fifo的開啟規則 如果當前開啟操作是為讀而開啟fifo時,若已經有相應程序為寫而開啟該fifo,則當前開啟操作將成功返回 否則,可能阻塞直到有相應程序為寫而開啟該fifo 當前開啟操作設定了阻塞標誌 或者,成功返回 當前開啟操作...