2014-03-18 92 views
-2

我試圖用三個子文件寫入簡單的FIFO程序,它向文件發送值,父文件讀取此文件。我的問題是,cfp = fopen(fifoName,「w」);應該earse文件並保存新的值,所以我認爲輸出應該看起來像「這是家長。從fifo上的孩子收到的值30」,但我的輸出是「這是父母。收到價值2010從FIFO的孩子「。感謝您的幫助。在UNIX中創建FIFO

什麼是錯在我的代碼?

int main() 
{ 
    int ret; 
    int p1, p2, p3, p4; 
    int value; 
    char fifoName[] = "/tmp/testfifo20"; 
    char errMsg[1000]; 
    FILE *cfp; 
    FILE *pfp; 
    int x1; 
    int x2, x3, x4; 

    ret = mknod(fifoName, S_IFIFO | 0600, 0); 
    if (ret < 0) 
    { 
    sprintf(errMsg, "Unable to create fifo: %s", fifoName); 
    errexit(errMsg); 
    } 

    if ((p3 = fork()) == 0) 
    { 
    x1 = 10; 
    cfp = fopen(fifoName, "w"); 
    if (cfp == NULL) 
     errexit("Unable to open fifo for writing"); 
    ret = fprintf(cfp, "%d", x1); 
    fflush(cfp); 
    exit(0); 
    } 

    if ((p2 = fork()) == 0) 
    { 
    x2 = 20; 
    cfp = fopen(fifoName, "w"); 
    if (cfp == NULL) 
     errexit("Unable to open fifo for writing"); 
    ret = fprintf(cfp, "%d", x2); 
    fflush(cfp); 
    exit(0); 
    } 

    if ((p3 = fork()) == 0) 
    { 
    x3 = 30; 
    cfp = fopen(fifoName, "w"); 
    if (cfp == NULL) 
     errexit("Unable to open fifo for writing"); 
    ret = fprintf(cfp, "%d", x3); 
    fflush(cfp); 
    exit(0); 
    } 
    else 
    { 
    pfp = fopen(fifoName, "r"); 
    if (pfp == NULL) 
     errexit("Unable to open fifo for reading"); 
    ret = fscanf(pfp, "%d", &value); 
    if (ret < 0) 
     errexit("Error reading from named pipe"); 
    fclose(pfp); 
    printf("This is the parent. Received value %d from child on fifo \n", 
     value); 
    unlink(fifoName); 
    exit(0); 
    } 
} 
+0

「* i'm試圖用三個子文件寫入簡單的FIFO程序,它向文件和父文件發送值*」簡單? – alk

+0

我想知道關於downvotes。一個非常有趣的問題,帶有代碼,具有預期的和實際的輸出。代碼甚至寫得很好,還有各種錯誤檢查。我不知所措 – SzG

回答

0

你爲什麼想到30?你應該期望的102030任意組合,如1020303020202010

2010是一個完全合理的結果。你叉3個孩子。其實,有處於第1叉一個錯字,你保存它的PID爲p3而不是p1。但是這沒關係。

重要的是,父進程及其3個孩子的調度不在你手中。顯然,核計劃按以下順序的過程:

  • P2:寫20到FIFO
  • P1:寫10到FIFO,其中包含2010現在
  • 父:從FIFO讀取2010,裏面是空的,現在
  • P3:寫30到FIFO,其中包含30現在

但是父進程只讀取一次FIFO,所以它錯過了30