0
#include<dirent.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main()
{
    int canal_son[2];
    int canal_father[2];
    pipe(canal_father);
    pipe(canal_son);
    char mesaj_son[20];
    char mesaj_father[20];

    if (fork()==0)
    {
        printf("Son %d\n",getpid());
        read(canal_father[0],mesaj_father,4);
        int j;
        for(j=0;j<5;j++) 
        {
            printf("The message from father is: %s \n",mesaj_father);
            read(canal_father[0],mesaj_father,4);
            write(canal_son[1],"son",3);
        }
        exit(0);
    }

    int i=5;
    for (i=0;i<5;i++)
    {
        write(canal_father[1],"mesas",4);
        read(canal_son[0],mesaj_son,10);
        printf("we are in father:%s\n",mesaj_son);
    }
}

我要做的是创建用于在孩子和父亲之间进行通信的管道,唯一的问题是当我尝试同时使用两者时,我的进程会冻结,就像它期待一些输入,如果我只使用一个管道,canal_father 或 canal_son一切都很完美,有没有人知道使用 2 个管道有什么问题?

非常感谢。

4

3 回答 3

1

您的孩子正在尝试从父母的管道中读取两次。结果,孩子和父母都在等待对方开始写作。

完整的事件顺序是这样的:

  1. 家长给孩子写信。
  2. 孩子从父母那里读。
  3. 父母等待从孩子那里阅读。
  4. 孩子等待从父母那里阅读。

要解决此问题,请从孩子的开头删除额外的阅读,并在循环中阅读后移动打印输出。所以子代码如下所示:

    printf("Son %d\n",getpid());
    int j;
    for(j=0;j<5;j++) 
    {
        read(canal_father[0],mesaj_father,4);
        printf("The message from father is: %s \n",mesaj_father);
        write(canal_son[1],"son",3);
    }
    exit(0);
于 2013-04-22T17:31:12.437 回答
1

您的代码的结构方式是,儿子在写一条之前尝试从父亲那里读取两条消息,而父亲写一条消息然后尝试读取一条。所以儿子在第二次读取时阻塞(循环中的那个,j=0),而父亲在第一次读取时阻塞(i=0)。

此外,由于您在任何一个进程中都不会关闭任何写入端(有 4 个 - 两个在儿子中,两个在父亲中),因此您永远不会在读取时获得任何 EOF。这在这里并不是真正的问题,因为您从不等待 eof,但如果您尝试做更复杂的事情,可能会成为问题。

最后,您正在编写的消息不包括'\0'字符串的终止 NUL ( ),因此当您将 传递给它们时printf,它们是未终止的,这将导致问题。您需要在写入的数据中包含 NUL,或者从读取调用(返回值)中获取读取的长度并显式终止字符串。

在任何情况下,您都应该检查读取和写入调用的返回值是否存在错误。

于 2013-04-22T17:22:53.937 回答
1

您正在读取和写入不同大小、未终止的字符串并执行不同数量的读取和写入。如果您使大小和读/写一致,它就可以工作。

if (fork()==0)
{
    printf("Son %d\n",getpid());
    int j;
    for(j=0;j<5;j++)
    {
        printf("The message from father is: %s \n",mesaj_father);
        read(canal_father[0],mesaj_father,6);
        write(canal_son[1],"son",4);
    }
    exit(0);
}

int i=5;
for (i=0;i<5;i++)
{
    write(canal_father[1],"mesas",6);
    read(canal_son[0],mesaj_son,4);
    printf("we are in father:%s\n",mesaj_son);
}
于 2013-04-22T17:27:46.737 回答