#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它都能完美地工作,有人知道使用两个管道有什么问题吗?
非常感谢。
发布于 2013-04-23 01:31:12
您的孩子正在尝试从家长的管道中读取两次。结果,子进程和父进程都在等待对方开始写入。
事件的完整顺序如下:
要解决此问题,请从子对象的开头删除额外的读取,并在循环中的读取之后移动打印输出。因此,子代码如下所示:
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-23 01:22:54
按照你的代码结构,儿子在写一条消息之前尝试从父亲那里读取两条消息,而父亲先写一条消息,然后再试着读一条。因此,子进程在第二次读取(循环中的那个,使用j=0)时阻塞,而父进程在第一次读取(i=0)时阻塞。
此外,因为在这两个进程中都不会关闭任何写结束(有4个--两个在子进程中,两个在父进程中),所以在读取时永远不会获得任何EOFs。这在这里不是真正的问题,因为你永远不会等待eof,但如果你试图做更复杂的事情,可能会成为一个问题。
最后,您正在编写的消息不包括字符串的终止NUL ('\0'),因此当您向它们传递printf时,它们是未终止的,这将导致问题。您需要在写入的数据中包含NULs,或者从读取调用中读取长度(返回值)并显式终止字符串。
在任何情况下,您都应该检查读取和写入调用的返回值是否有错误。
发布于 2013-04-23 01:27:47
您正在读取和写入不同大小的、未终止的字符串,并进行不同数量的读取和写入。如果您使大小和读/写保持一致,它就会起作用。
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);
}https://stackoverflow.com/questions/16152815
复制相似问题