msgqid=msgget(SVKEY,0777);
时间: 2024-05-31 19:13:18 浏览: 87
这段代码是在 Linux 系统下使用 System V IPC 中的消息队列机制创建一个新的消息队列或获取一个已经存在的消息队列的标识符(ID)。
其中,SVKEY 是消息队列的键值,0777 表示消息队列的权限,以八进制表示。msgqid 是返回的消息队列的标识符。
具体来说,如果消息队列已经存在,则这个函数返回该消息队列的标识符;如果消息队列不存在,则创建一个新的消息队列并返回其标识符。如果发生错误,则返回 -1。
相关问题
struct msgform { long mtype; char mtext[256]; } msg; int msgqid, i; void client() { int i; msgqid = msgget(MSGKEY, 0777); for (i = MAX_TYPE; i >= 1; i--) { msg.mtype = i; printf("input your string in smg:"); s
这是一个使用消息队列进行进程间通信的程序。程序中定义了一个msgform结构体,包含一个消息类型和一个消息文本。定义了一个msgqid和一个i变量。程序中使用了msgget函数来获取消息队列的标识符,MSGKEY是一个宏定义,表示消息队列的键值。程序中使用了MAX_TYPE常量来表示消息的最大类型。
在client函数中,程序通过msgget函数获取消息队列的标识符,并使用一个for循环向消息队列中发送消息。在循环中,程序先将消息的类型设置为i,然后通过printf函数让用户输入消息的文本内容。程序中使用了fgets函数来读取用户输入的消息文本,然后将消息发送到消息队列中。最后,程序通过sleep函数暂停一段时间,以便观察程序的执行情况。
在server函数中,程序通过msgget函数获取消息队列的标识符,并使用一个for循环从消息队列中接收消息。在循环中,程序先将消息的类型设置为i,然后使用msgrcv函数从消息队列中接收消息。接收到的消息会保存到msg结构体中。程序中使用了printf函数来输出接收到的消息文本。最后,程序通过sleep函数暂停一段时间,以便观察程序的执行情况。
需要注意的是,这段代码中省略了client函数中的一部分代码,可能是由于复制过程中出现了问题。在实际的代码中,程序应该使用fgets函数来读取用户输入的消息文本,然后将消息发送到消息队列中。
#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); 16 } 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); }
这段代码实现了一个简单的消息队列通信程序,包括一个服务端和一个客户端。客户端向服务端发送一组消息,服务端接收消息并输出。具体实现如下:
1. 定义了一个消息结构体 msgform,包括消息类型和消息内容。
2. 在客户端函数 CLIENT() 中,首先获取消息队列的标识符 msgqid,然后利用 for 循环向服务端发送 10 组消息,每组消息的类型从 10 到 1 递减。发送消息使用 msgsnd 函数,其中第一个参数是消息队列标识符,第二个参数是指向消息结构体的指针,第三个参数是消息长度,第四个参数是消息发送标志。
3. 在服务端函数 SERVER() 中,首先创建一个消息队列并获取其标识符 msgqid,然后利用 do-while 循环接收客户端发送的消息,直到接收到类型为 1 的消息为止。接收消息使用 msgrcv 函数,其中第一个参数是消息队列标识符,第二个参数是指向消息结构体的指针,第三个参数是消息长度,第四个参数是消息类型,第五个参数是消息接收标志。
4. 最后在 main 函数中,使用 fork 函数创建服务端和客户端两个子进程,分别调用 SERVER() 和 CLIENT() 函数。使用 wait 函数等待两个子进程结束。
需要注意的是,在发送消息时,消息长度应该是 1024,而在接收消息时,消息长度应该是 1030。这是因为消息结构体中的 mtext 字段有 1030 字节,其中前 4 个字节是消息类型,后面 1026 个字节是消息内容。
阅读全文