[英]Unix Processes PIPE
我有以下任务要做:
乒乓。 乒乓游戏将通过两个过程进行。 第一个进程将生成一个介于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
我给你一个经过纠正的程序,并在注释中给出解释:
#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 p2[2];
int a, n;
pipe(p);
pipe(p2);
int pid = fork();
if (pid == 0)
{
close(p[1]); // not writing in p, so closing p[1] immediately
close(p2[0]); // not reading in p2, so closing p2[0] immediately
srand(time(NULL));
do {
if ((a = read(p[0], &n, sizeof(int)))==-1)
perror("Error read pipe:");
if (a == 0) // nothing read means all processes have closed p[1]
n = 0;
else
printf("Process 2 recived %d\n", n);
int r = 50 + rand() % 950; // Only need one random number, and need one different each time
n -= r;
if (n > 0)
{
if(write(p2[1], &n, sizeof(int))==-1)
perror("Error write pipe:");
}
} while (n > 0);
close(p[0]); close(p2[1]);
exit(0); // or return(0) - as pointed out by Stian
}
else if (pid > 0)
{
close(p[0]); // not reading in p, so closing p[0] immediately
close(p2[1]); // not writing in p2, so closing p2[1] immediately
srand(time(NULL) + pid); // Adding pid so that processes each use a different seed
n = rand() % 10000 + 5000; // Only need one random number
while (n > 0)
{
if (write(p[1], &n, sizeof(int))==-1)
perror("Error write pipe:");
// wait(0); Wrong use of wait()
if ((a = read(p2[0], &n, sizeof(int)))==-1)
perror("Error read pipe:");
if (a == 0) // nothing read means all processes have closed p2[1]
n = 0;
else
printf("Process 1 recived %d\n", n);
int r = 50 + rand() % 950;
n -= r;
}
close(p[1]); close(p2[0]);
}
wait(NULL); // Better use of wait(). Still not perfect, you need to check return value.
return 0;
}
您需要两个管道。 每个方向一个
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.