簡體   English   中英

為什么沒人讀后繼續寫入命名管道?

[英]Why does writing to a named pipe continue after no one is reading?

我正在做一些實驗來了解命名管道。 據我了解,操作系統將阻止寫入命名管道的程序,直到另一個程序從命名管道讀取數據。 所以我寫了兩個程序, startloopreadbyte 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.

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