一个简单的多进程程序在Linux中。
输入一些数,如 ./findPrime 10 20 30。
该程序将创建3个子进程来查找2-10、10-20、20-30之间所有的质数。
一旦一个子进程发现一个质数,它将通过管道写入“2是质数”并发送到父进程。父进程将在屏幕上打印出来。
这里的问题是,我使用一个while循环向管道中写入消息,并在父进程中使用另一个while循环接收消息,但是在下面的代码中,它只显示第一条消息,所以我想知道发生了什么事情,如何保持从那个管道中读取?我错过了什么吗?非常感谢!
char readBuffer[100];
char outBuffer[15];
int pids[argc];
int fd[2];
pipe(fd);
for(i = 0; i < argc; i++)
{
if( i == 0)
bottom = 2;
else
bottom = args[i - 1];
top = args[i];
pids[i] = fork();
if(pids[i] == 0)
{
printf("Child %d: bottom=%d, top=%d\n", getpid(), bottom, top);
close(fd[0]);
j = bottom;
while(j <= top)
{
int res = findPrime(j);
if(res == 1)
{
sprintf(outBuffer, "%d is prime", j);
write(fd[1], outBuffer, (strlen(outBuffer)+1));
}
j++;
}
exit(0x47);
}
else if(pids[i] < 0)
{
fprintf(stderr, "fork failed! errno = %i\n", errno);
break;
}
else
{
close(fd[1]);
while((nbytes = read(fd[0], readBuffer, sizeof(readBuffer))) > 0 )
printf("%s\n", readBuffer);
int status = 0;
pid = waitpid(pids[i], &status, 0);
if(pid >= 0)
printf("Child %d exited cleanly\n", pid);
}
}
这些子进程应该按照它们创建的顺序运行,例如当进程1完成时,进程2将会运行,在2之后进程3运行。 我还希望父进程在接收到消息后立即显示它。