systemV消息队列
Posted lsaejn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了systemV消息队列相关的知识,希望对你有一定的参考价值。
参考命令:
1. ipcs
2. ipckill
例子参考了网络,作者不详。
发送数据
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/msg.h> #include <errno.h> #define MAX_TEXT 512 struct msg_st { long int msg_type; char text[MAX_TEXT]; }; int main(int argc, char **argv) { struct msg_st data; char buffer[BUFSIZ]; int msgid = -1; // 建立消息队列 msgid = msgget((key_t)1234, 0666 | IPC_CREAT); if (msgid == -1) { fprintf(stderr, "msgget failed error: %d ", errno); exit(EXIT_FAILURE); } // 向消息队里中写消息,直到写入end while (1) { printf("Enter some text: "); fgets(buffer, BUFSIZ, stdin); data.msg_type = 1; // 注意2 strcpy(data.text, buffer); // 向队列里发送数据 if (msgsnd(msgid, (void *)&data, MAX_TEXT, 0) == -1) { fprintf(stderr, "msgsnd failed "); exit(EXIT_FAILURE); } // 输入end结束输入 if (strncmp(buffer, "end", 3) == 0) { break; } sleep(1); } exit(EXIT_SUCCESS); }
接受进程
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/msg.h> #include <errno.h> struct msg_st { long int msg_type; char text[BUFSIZ]; }; int main(int argc, char **argv) { int msgid = -1; struct msg_st data; long int msgtype = 0; // 注意1 // 建立消息队列 msgid = msgget((key_t)1234, 0666 | IPC_CREAT); if (msgid == -1) { fprintf(stderr, "msgget failed width error: %d ", errno); exit(EXIT_FAILURE); } // 从队列中获取消息,直到遇到end消息为止 while (1) { if (msgrcv(msgid, (void *)&data, BUFSIZ, msgtype, 0) == -1) { fprintf(stderr, "msgrcv failed width erro: %d", errno); } printf("You wrote: %s ", data.text); // 遇到end结束 if (strncmp(data.text, "end", 3) == 0) { break; } } // 删除消息队列 if (msgctl(msgid, IPC_RMID, 0) == -1) { fprintf(stderr, "msgctl(IPC_RMID) failed "); } exit(EXIT_SUCCESS); }
以发送一个文件为例,数据流:
输入文件->用户发送程序->内核IPC(管道,FIFO,消息队列)->接收端->输出文件
一共4次系统调用。相比共享内存要多2次。
以上是关于systemV消息队列的主要内容,如果未能解决你的问题,请参考以下文章