#include <stdio.h> #include <sys/types.h> #include <sys/msg.h> #include <sys/ipc.h> #define MSGKEY 75 struct msgform { long mtype; char mtext[1030]; }msg; int msgqid,i; void CLIENT() { int i; msgqid=msgget(MSGKEY,0777); for (i=10;i>=1;i--) { msg.mtype=i; printf("(client) sent \n"); msgsnd(msgqid,&msg,1024,0); } exit(0); } void SERVER() { msgqid=msgget(MSGKEY,0777|IPC_CREAT); do{ msgrcv(msgqid,&msg,1030,0,0); printf("(Server) recieved\n"); } while(msg.mtype!=1); msgctl(msgqid,IPC_RMID,0); exit(0); } void main() { while((i=fork())==-1); if(!i) SERVER(); while((i=fork())==-1); if(!i) CLIENT(); wait(0); wait(0); }解释一下这个代码。为什么不会一直创建进程?
时间: 2023-12-03 13:03:22 浏览: 68
实验六.docx
这段代码实现了一个基于消息队列的进程间通信的例子,其中包括了一个客户端和一个服务端。主函数中首先通过fork()创建了两个子进程,一个子进程用来运行SERVER()函数,另一个子进程用来运行CLIENT()函数。在SERVER()函数中,首先调用msgget()函数创建了一个消息队列,然后通过do-while循环调用msgrcv()函数来接收从客户端发送过来的消息,直到收到类型为1的消息后,调用msgctl()函数删除消息队列并退出进程。在CLIENT()函数中,首先调用msgget()函数获取同一个消息队列,然后通过for循环不断地调用msgsnd()函数向消息队列中发送不同类型的消息。
对于为什么不会一直创建进程的问题,这是因为在主函数中使用了两个while循环,通过fork()函数创建进程后,父进程会返回子进程的PID,而子进程则返回0。因此在while循环中,只有其中一个分支会被执行,而另一个分支则会被跳过,从而避免了无限制地创建进程的问题。当两个子进程都创建成功后,主进程通过wait()函数等待它们的退出。
阅读全文