- 论坛徽章:
- 0
|
代码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:- 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")
- {
- print STDOUT "Parent Over\n";
- print ParentWRITER "OVER";
- last;
- }
- else
- {
- print ParentWRITER "$RECIEVER";
- }
- }
- }
- else {
- close (ParentWRITER);
- close (ParentWRITER);
- select ChildWRITER;
- $| = 1;
- $WRITER = 1;
- print STDOUT "Child WRITER $WRITER\n";
- print ChildWRITER "$WRITER";
- while (1)
- {
- print STDOUT "Child Prepare to RECIEVER\n";
- $RECIEVER = <ChildREADER>;
- if ($RECIEVER eq "OVER")
- {
- print STDOUT "Child Over\n";
- last;
- }
- elsif($RECIEVER eq "$WRITER")
- {
- $WRITER++;
- print STDOUT "Child WRITER $WRITER\n";
- print ChildWRITER "$WRITER";
- }
- }
- }
复制代码 代码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";
}
}
}
|
|