2013-02-07 121 views
0

我遇到以下代碼的問題。我正在使用叉子(創建流程)進行實驗室任務。它是一個簡單的程序,它應該從鍵盤讀取輸入,然後將其讀取/寫入FIFO並顯示其寫入的內容和字節。我的fork fifo c代碼無法正常工作

當我運行它時,一切似乎都很好,直到我輸入一些文本。父打印消息顯示正常,但是從不顯示子打印消息,直到我輸入了第二條消息,它總是說它寫了80個字節,儘管我知道它沒有,並且有一些奇怪的到處都是特殊字符

這裏是關於程序應該如何可執行文件: 的Linux:http://www.mediafire.com/?6806v24q6lz7dpc QNX:http://www.mediafire.com/?a9dhiwmrlx2ktkp

到目前爲止我的代碼:

#include<stdio.h> 
#include<stdlib.h> 
#include <sys/stat.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <fcntl.h> 
#include <string.h> 

int main(int argc, char *argv[]) { 

    char FifoName[] = "fifoDan"; 
    int fd; 
    pid_t retval; 
    int size_read; 
    char buff[80]; 
    int size_written; 

    mknod(FifoName, S_IFIFO | 0666, 0); 

    // Check if its not equal to zero (ie: child process = 0) 
    if (retval = fork()) { 

      printf ("Parent: Waiting for writers \n"); 

      if(fd = open(FifoName, O_RDONLY) == -1) { 
          perror("Could not read the FIFO"); 
        return EXIT_FAILURE; 
      } 

      printf ("Parent: Received a writer \n"); 

      do { 

          int strsize; 

          size_read = read(fd, buff, sizeof(buff)); 

          printf("Parent: read %d bytes: %s \n", size_read, buff); 
          fflush(stdout); 

          strsize = strlen(buff); 

          // put a '\0' at the end of the data 
          buff[strsize] = '\0'; 


        } while(size_read > 0); 


        close(fd); 
        waitpid(retval, NULL, NULL); 

        if(unlink(FifoName) != -1) { 
          return EXIT_SUCCESS; 
        } else { 
          return EXIT_FAILURE; 
        } 


    } else { 


     printf ("Child pid %d waiting for readers \n", getpid()); 
     fflush(stdout); 

     if(fd = open(FifoName, O_WRONLY) == -1) { 
          perror("Could not read the FIFO"); 
        return EXIT_FAILURE; 
      } 

     printf ("Child: Got a reader, enter some stuff:\n"); 
     fflush(stdout); 

     while(fgets(buff, 80, stdin) != NULL) { 

        int strsize; 

        strsize = strlen(buff); 

        if(strsize < 80) { 
          buff[strsize] = '\0'; 
        } 

        size_written = write(fd, buff, sizeof(buff)); 

        printf ("Child: wrote %d bytes \n", size_written); 
        fflush(stdout); 

      } 

      close(fd); 

    } 


} 

回答

4

這條線(例如)不會做什麼你認爲它確實如此:

if(fd = open(FifoName, O_WRONLY) == -1) 

相等運算符有更高的precedence比賦值運算符,讓你做什麼,其實是這樣的:

if(fd = (open(FifoName, O_WRONLY) == -1)) 

,當你想這樣的:

if((fd = open(FifoName, O_WRONLY)) == -1) 

與緩衝區中讀取的問題/寫是因爲你寫整個緩衝區:

size_written = write(fd, buff, sizeof(buff)); 

更改爲僅使用strsize代替實際字符串。

+0

+1。這是我27年來一直在寫C的經驗,雖然在if語句中寫作業是合法的,但它也是創建錯誤的絕妙方式。一個簡單賦值的額外代碼行不會減慢編譯速度。 :) –

+0

感謝您的幫助。它解決了我遇到的問題。但現在它說,父母和孩子每次輸入內容時都會讀/寫80個字節,而不是計算從鍵盤輸入的字節數。也許我傳遞了錯誤的價值? – user1930558

+0

@ user1930558這是因爲你_write_ 80字節。由於在'write'調用中使用'sizeof(buff)',因此您可以編寫整個緩衝區。 –