免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1736 | 回复: 0
打印 上一主题 下一主题

Perl脚本用pipe进行父进程与子进程通信的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-29 16:49 |只看该作者 |倒序浏览
代码1是问题,其功能就是实现父进程与子进程之间的双向通信。流程如下:
child向parent发送消息1。
parent接收到后向child发送消息1。
child接收到后向parent发送消息2。
parent接收到后向child发送消息2。
child接收到后向parent发送消息3。
parent接收到后向child发送消息3。
child接收到后向parent发送消息4。
parent接收到后向child发送消息OVER,并退出循环。
child接收到后退出循环。

代码1的问题是,parent在第一次接收消息是时候就卡不动了,应该是没有接收到消息。

对代码稍做调整,形成代码2,问题就解决了。所做的调整在所有发送的消息后面加上"\n"。但是其中的原因是什么呢?大家帮忙分析分析。


代码1:
  1. pipe(ParentREADER, ChildWRITER);
  2. pipe(ChildREADER, ParentWRITER);
  3. $retval = fork();
  4. if ($retval != 0) {
  5. close (ChildREADER);
  6. close (ChildWRITER);
  7. select ParentWRITER;
  8. $| = 1;
  9. while (1)
  10. {
  11. print STDOUT "Parent Prepare to RECIEVER\n";
  12. sleep 1;
  13. $RECIEVER = <ParentREADER>;
  14. print STDOUT "Parent RECIEVER $RECIEVER\n";
  15. if ($RECIEVER eq "4")
  16. {
  17. print STDOUT "Parent Over\n";
  18. print ParentWRITER "OVER";
  19. last;
  20. }
  21. else
  22. {
  23. print ParentWRITER "$RECIEVER";
  24. }
  25. }
  26. }
  27. else {
  28. close (ParentWRITER);
  29. close (ParentWRITER);
  30. select ChildWRITER;
  31. $| = 1;
  32. $WRITER = 1;
  33. print STDOUT "Child WRITER $WRITER\n";
  34. print ChildWRITER "$WRITER";
  35. while (1)
  36. {
  37. print STDOUT "Child Prepare to RECIEVER\n";
  38. $RECIEVER = <ChildREADER>;
  39. if ($RECIEVER eq "OVER")
  40. {
  41. print STDOUT "Child Over\n";
  42. last;
  43. }
  44. elsif($RECIEVER eq "$WRITER")
  45. {
  46. $WRITER++;
  47. print STDOUT "Child WRITER $WRITER\n";
  48. print ChildWRITER "$WRITER";
  49. }
  50. }
  51. }

复制代码
代码2:
pipe(ParentREADER, ChildWRITER);
pipe(ChildREADER, ParentWRITER);
$retval = fork();
if ($retval != 0) {
close (ChildREADER);
close (ChildWRITER);
select ParentWRITER;
$| = 1;
while (1)
{
print STDOUT "Parent Prepare to RECIEVER\n";
sleep 1;
$RECIEVER = <ParentREADER>;
print STDOUT "Parent RECIEVER $RECIEVER\n";
if ($RECIEVER eq "4\n")
{
print STDOUT "Parent Over\n";
print ParentWRITER "OVER\n";
last;
}
else
{
print ParentWRITER "$RECIEVER\n";
}
}
}
else {
close (ParentWRITER);
close (ParentWRITER);
select ChildWRITER;
$| = 1;
$WRITER = 1;
print STDOUT "Child WRITER $WRITER\n";
print ChildWRITER "$WRITER\n";
while (1)
{
print STDOUT "Child Prepare to RECIEVER\n";
$RECIEVER = <ChildREADER>;
if ($RECIEVER eq "OVER\n")
{
print STDOUT "Child Over\n";
last;
}
elsif($RECIEVER eq "$WRITER\n")
{
$WRITER++;
print STDOUT "Child WRITER $WRITER\n";
print ChildWRITER "$WRITER\n";
}
}
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP