2009-09-14 38 views
1

假设父母和孩子都使用一个管道进行写入和读取的手段,当一个写入,然后只有其他读取,否则它阻止。有什么办法可以做到吗?我试着用睡眠功能来做,但由于竞争条件,它没有给出正确的输出。 这是我的代码有没有办法在Unix中使用一个管道同步C和父子?

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

#define MSGSIZE 16 
main() 
{ 
    int i; 
    char *msg = "How are you?"; 
    char inbuff[MSGSIZE]; 
    int p[2]; 
    pid_t ret; 
    pipe (p); 
    ret = fork(); 
    if (ret > 0) 
    { 
     i = 0; 
     while (i < 10) 
     { 
      write (p[1], msg, MSGSIZE); 
      sleep (2); 
      read (p[0], inbuff, MSGSIZE); 
      printf ("Parent: %s\n", inbuff); 
      i++; 
     } 
    exit(1); 
    } 
    else 
    { 
     i = 0; 
     while (i < 10) 
     { 
      sleep (1); 
      read (p[0], inbuff, MSGSIZE); 
      printf ("Child: %s\n", inbuff); 
      write (p[1], "i am fine", strlen ("i am fine")); 
      i++; 
     } 
    } 
    exit (0); 
} 
+0

管道有两端,通常;) - 也许你应该张贴一些代码,所以我们可以看到你已经尝试了什么。 –

+0

我已经添加了代码,但所有新行都被吃掉了。我应该如何正确发布代码 – avd

+0

@aditya,身份与4空格。在编辑区域上方有一个按钮(将鼠标悬停在其上以获取描述),该按钮会自动为所选文本执行此操作。 – Inshallah

回答

4

pipe()创建两个filedescriptor,一个用于读取,另一个用于写入。对于双向通信,您需要创建两个管道(四个文件描述符)。

6

您无法对单个管道执行双向同步。

您可以在Unix域套接字上进行双向同步。

+3

请注意,您可以使用'socketpair()'调用轻松创建一个充当双向管道的unix域套接字 – bdonlan

相关问题