2017-06-01 32 views
-1

我最近遇到這個例子,試圖在Linux C中解決我自己的管道問題,它回答了我的問題,但給了我另一個問題,爲什麼子進程在第一條消息之後沒有離開while循環?如果它已經讀完輸入消息,是不是在父母有機會在睡眠(5)之後輸入第二條消息之前離開?讀取第一條消息後,子進程如何不離開while循環?

#include <stdio.h> 
    #include <unistd.h> 
    #include <sys/ioctl.h> 

    int main() 
    { 
     int pid = 0; 

     // create pipe pair 
     int fd[2]; 
     pipe(fd); 

     pid = fork(); 
     if (pid == 0) 
     { 
      // child side 
      char *buff = NULL; 
      char byte = 0; 
      int count = 0; 

      // close write side. don't need it. 
      close(fd[1]); 

      // read at least one byte from the pipe. 
      while (read(fd[0], &byte, 1) == 1) 
      { 
       if (ioctl(fd[0], FIONREAD, &count) != -1) 
       { 
        fprintf(stdout,"Child: count = %d\n",count); 

        // allocate space for the byte we just read + the rest 
        // of whatever is on the pipe. 
        buff = malloc(count+1); 
        buff[0] = byte; 
        if (read(fd[0], buff+1, count) == count) 
         fprintf(stdout,"Child: received \"%s\"\n", buff); 
        free(buff); 
       } 
       else 
       { // could not read in-size 
        perror("Failed to read input size."); 
       } 
      } 

      // close our side 
      close(fd[0]); 
      fprintf(stdout,"Child: Shutting down.\n"); 
     } 
     else 
     { // close read size. don't need it. 
      const char msg1[] = "Message From Parent"; 
      const char msg2[] = "Another Message From Parent"; 
      close(fd[0]); 
      fprintf(stdout, "Parent: sending \"%s\"\n", msg1); 
      write(fd[1], msg1, sizeof(msg1)); 
      sleep(5); // simulate process wait 
      fprintf(stdout, "Parent: sending \"%s\"\n", msg2); 
      write(fd[1], msg2, sizeof(msg2)); 
      close(fd[1]); 
      fprintf(stdout,"Parent: Shutting down.\n"); 
     } 
     return 0; 
    } 
+0

您可能想要閱讀'read()'的手冊頁 – EOF

+1

只有當父級關閉管道或發生錯誤時,read()纔會返回除1之外的內容。爲什麼循環會在這之前結束? – Barmar

+1

如果父母沒有發送消息,'read()'將被阻塞,直到有東西要讀。 – Barmar

回答

0

read塊如果沒有可用數據(除非該管被做非阻塞)直到數據到達。

+0

哦,好吧!因此,如果父級更新寫入結束,讀取結束再次覆蓋新的消息,並且我們可以多次執行此操作,直到父進程關閉管道? – pleb

+0

是的。 。 。 。 。 。 。 – ikegami

相關問題