首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用2个管道在子级和父级之间进行通信的管道

使用2个管道在子级和父级之间进行通信的管道
EN

Stack Overflow用户
提问于 2013-04-23 01:13:06
回答 3查看 914关注 0票数 0
代码语言:javascript
复制
#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它都能完美地工作,有人知道使用两个管道有什么问题吗?

非常感谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-23 01:31:12

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

事件的完整顺序如下:

  1. 父级写入子级。
  2. 子级从父级读取。
  3. 父级等待从子级读取。
  4. 子级等待从父级读取。

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

代码语言:javascript
复制
    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);
票数 1
EN

Stack Overflow用户

发布于 2013-04-23 01:22:54

按照你的代码结构,儿子在写一条消息之前尝试从父亲那里读取两条消息,而父亲先写一条消息,然后再试着读一条。因此,子进程在第二次读取(循环中的那个,使用j=0)时阻塞,而父进程在第一次读取(i=0)时阻塞。

此外,因为在这两个进程中都不会关闭任何写结束(有4个--两个在子进程中,两个在父进程中),所以在读取时永远不会获得任何EOFs。这在这里不是真正的问题,因为你永远不会等待eof,但如果你试图做更复杂的事情,可能会成为一个问题。

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-04-23 01:27:47

您正在读取和写入不同大小的、未终止的字符串,并进行不同数量的读取和写入。如果您使大小和读/写保持一致,它就会起作用。

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16152815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档