-當要寫入的資料量小於等於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 當前開啟操作設定了阻塞標誌 或者,成功返回 當前開啟操作...