2014-03-18 40 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