簡體   English   中英

讀取和寫入管道問題

[英]reading and writing to a pipe c issue

這是程序:

  int fd[2];
  char buf1 [31];
  int i;
  char buf2;

  pipe(fd);

  if (fork() == 0) { // child
    close(fd[1]); // close writing pipe
    for(i = 0; i< 20; i++) { 
        read(fd[0], buf1, 30);
        printf("%s\n", buf1);

    }
    close(fd[0]);
  }

  else { // parent
    close(fd[0]); // close reading end
    buf2 = 'a';
    for (i = 0; i < 20; i++) {
        write(fd[1], &buf2, sizeof(buf2));
    }
    close(fd[1]);
  }
  wait(NULL);

由於如果其中沒有任何內容,則讀取會阻塞,因此我們將首先寫入管道。

我的問題是關於功能。 for循環運行20次,每次將a寫入管道時。 經過20次迭代后,寫入端的管道將包含aaaaaaaaaaaaaaaaaaaa

在孩子中,我將所有20個a's都讀到buf1 ,然后打印結果。

現在,既然我們已經寫完並閱讀了我們寫的內容,管道是空的嗎?

由於這里也有一個for循環,我們再次閱讀,但是這次,我認為管道是空的,因此沒有什么可讀取的。 所以我認為經過20次迭代的讀取后的最終輸出只是aaaaaaaaaaaaaaaaaaaa

但實際上是這樣的:

aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa

為什么? 閱讀后管道不為空嗎?

您是正確的,如果子級調用在父級寫任何東西之前先read ,則該調用會阻塞; 但是,在父級關閉文件描述符之后,情況就不再如此,並且read將為EOF返回0。

read調用不會清除緩沖區。 操作系統成功讀取零字符,因此更改了緩沖區的前零個字符。 也就是說,它根本不會改變buf1 因此,一旦所有數據都已讀入緩沖區, printf調用將始終執行相同的操作。

請注意,您不能保證獲得此輸出。 很有可能子進程將在父進程的一些但不是全部的write調用之后運行,在這種情況下,它將不會一次讀取所有20 a並打印較短的字符串。 這就是為什么我在上面說過, 一旦讀取了所有數據printf調用將始終執行相同的操作。 要處理未寫入所有數據的情況,應檢查read的返回值。 如果它小於20,則您沒有將完整的字符串讀入緩沖區(並且應在目標指針提前的情況下再次調用read ,以免覆蓋數據)。 如果它為零,那么您已經到達文件末尾(寫結束已關閉); 如果為負,則有一個錯誤,您應該檢查errno來處理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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