[英]Why does writing to a named pipe continue after no one is reading?
我正在做一些實驗來了解命名管道。 據我了解,操作系統將阻止寫入命名管道的程序,直到另一個程序從命名管道讀取數據。 所以我寫了兩個程序, startloop
和readbyte
。 startloop
創建一個fifo,並在每次讀取客戶端( readbyte
)時不斷對其進行寫操作:
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
int main(int argc, char *argv[]) {
const char num = 123;
mkfifo("fifo", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
int fd = open("fifo", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
while (1) {
printf("loop_start\n");
write(fd, &num, sizeof(num));
}
close(fd);
return 0;
}
readbyte
在運行時從fifo讀取一個字節:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
int main(int argc, char *argv[]) {
char num;
int fd;
if ((fd = open(argv[1], O_RDONLY, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) {
perror("Cannot open input file\n"); exit(1);
}
read(fd, &num, sizeof(num));
printf("%d\n", num);
close(fd);
return 0;
}
readbyte
在“ fifo”上運行時按預期打印數字:
hostname:dir username$ ./readbyte fifo
65
如我所料, loopstart
不會打印任何內容,直到我從帶有readbyte
讀取它readbyte
。 但是,當它被解除阻塞時,它多次寫入“ fifo”,而不是立即被掛起。 為什么是這樣?
hostname:dir username$ ./startloop
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
loop_start
“據我了解,操作系統將阻止寫入命名管道的程序,直到另一個程序從命名管道讀取數據。”
這種理解是不正確的。 除非管道/ FIFO已滿,否則write
將不會阻塞。 從管道操作 :
管道的容量有限。 如果管道已滿,則取決於是否設置了O_NONBLOCK標志(請參見下文),write(2)將阻塞或失敗。
至於為什么第一次write
似乎被阻止-實際上卻沒有。 open
是阻礙。 從fifo手冊 :
必須先在兩端打開FIFO(讀取和寫入),然后才能傳遞數據。 通常,打開FIFO塊,直到另一端也打開。
更新:實際上,以上對於第一次write
都是正確的。 但是可能還有更多的解釋。 一旦readbyte
程序關閉了fifo,隨后的write
調用應開始失敗。
測試寫入結果
while (1) {
printf("loop_start\n");
int ret = write(fd, &num, sizeof(num));
if(ret == -1)
{
perror("error writing to fifo");
exit(1);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.