【发布时间】:2016-04-24 12:42:26
【问题描述】:
我有以下任务要做:
乒乓球。两个进程将进行乒乓球比赛。 第一个进程将生成一个介于 5000 和 15000 之间的随机数,并将其发送给另一个进程。 此过程将减去一个随机值(介于 50 和 1000 之间)并将该数字发回, 进程之间的聊天将使用管道通道实现。 当值低于零时,游戏结束。 每个进程都会打印接收到的值。
所以我写了以下代码:
#include <stdio.h>
#include <time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
int p[2];
int a, n;
pipe(p);
int pid = fork();
if (pid == 0)
{
int r = 0;
srand(time(NULL));
while ( r < 50 || r > 1000)
{
r = rand();
}
if ((a=read(p[0], &n, sizeof(int)))==-1)
perror("Error read pipe:");
printf("Process 2 recived %d\n", a);
a = a - r;
close(p[0]); close(p[1]);
}
else if (pid > 0)
{
srand(time(NULL));
while ( n < 5000 || n > 15000) {
n = rand();
}
while (n > 0)
{
printf("Process 1 recived %d\n", n);
if (write(p[1], &n, sizeof(int))==-1)
perror("Error write pipe:");
wait(0);
}
}
return 0;
}
当它被执行时,它进入一个无限循环,打印"Process 1 received 4",我不知道为什么。
我创建了另一个管道,现在它正确打印了第一个接收到的值,但是从第二个过程开始,它发生了同样的事情
Process 1 recived 9083
Process 2 recived 4
Process 1 recived 4
and infinite loop
【问题讨论】:
-
请不要更新问题中的代码。
-
请注意,这两个随机数序列几乎可以保证是相同的(如果其中一个进程恰好在时间 T 执行
time(NULL)而另一个在时间 T +1,但大多数情况下他们都会在时间 T 执行它)。一个简单的解决方法是使用time(NULL) + pid代替time(NULL)。