【记录】system v ipc(2) 消息队列

来源:互联网 发布:奴婢知奴婢知错跪罚 编辑:程序博客网 时间:2024/05/16 12:25

消息队列类似有名管道,也是用于进程间传递数据,由于有类型的区分可以细分出不同的进程写入的数据。


使用步骤:

1、先自定义一个包含long类型变量的结构体

2、使用ftok创建一个key_t变量

3、使用msgget()创建一个消息队列

4、使用msgsnd()/msgrcv()发送接收数据

(5、使用msgctl()删除队列)


int msgget(key_t, int flag)

key:ftok()生成的key值

flag:操作消息队列的标志,与open()类似,”IPC_CREAT|0666“表示以0666权限(rw-rw-rw-)创建或打开消息队列


返回值:消息队列的id,错误返回-1


int msgsnd(int msgid, const void *msgp, size_t size, int flag )

msgid:msgget生成的id

msgp:自定义的结构体,包含要发送的数据

size:发送数据大小

flag:0表示发送完才返回值,IPC_NOWAIT(数值为2048)表示开始发送便返回值


返回值成功0,失败-1


int msgrcvr(int msgid, void *msgp, size_t size, long msgtype, int flag )

msgid:msgget生成的id

msgp:自定义的结构体地址,储存要接收的数据

size:接收数据大小

msgtype:消息的类型,也就是结构体变量中long变量的数值,只有符合的才会接收

flag:0表示直到接收到否则一直阻塞,IPC_NOWAIT(数值为2048)表示没有值便返回ENOMSG


返回值成功返回接收到的消息长度,失败-1


例子:


发送端:

#include <stdio.h>#include <errno.h>#include <stdlib.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>struct person{long type;int age;char sex;char name[16];};struct person initking(struct person king){king.type = 9;king.age = 49;king.sex = 'f';snprintf(king.name, 16, "Peter");return king;}int main(void){key_t key;key = ftok(".", 201);int msgid;if((msgid = msgget(key, IPC_CREAT|0666)) == -1){perror("msgget error");exit(1);}struct person king;king = initking(king);if(msgsnd(msgid, &king, sizeof(struct person), 0) == -1){perror("sendmsg error");exit(1);}return 0;}


接收端:


#include <stdio.h>#include <errno.h>#include <stdlib.h>#include <sys/ipc.h>#include <sys/msg.h>#include <sys/types.h>struct person{long type;int age;char sex;char name[16];};int main(void){key_t key;key = ftok(".", 201);int msgid;if((msgid = msgget(key, IPC_CREAT|0666)) == -1){perror("msgget error");exit(1);}struct person *king = malloc(sizeof(struct person));if(msgrcv(msgid, king, sizeof(struct person), 9, 0) == -1){perror("sendmsg error");exit(1);}printf("name = %s\nage = %d\nsex = %c\n", king->name, king->age, king->sex);msgctl(msgid, IPC_RMID, NULL);return 0;
}


编译
cc     msglist_revc.c   -o msglist_revccc     msglist_send.c   -o msglist_send

运行结果

zsmd@ubuntu:~/sys_cmd/systemv$ ./msglist_send zsmd@ubuntu:~/sys_cmd/systemv$ ./msglist_revc name = Peterage = 49sex = f


注意:自定义的结构体中long type,“type“变量名可以随意改变,接收时最好使用指针保存接收的数据,否则容易段错误。

原创粉丝点击