linux使用消息队列实例
时间: 2024-06-19 09:02:24 浏览: 16
Linux提供了多种消息队列的实现,其中比较常用的是System V消息队列和POSIX消息队列。
1. System V消息队列
System V消息队列提供了一个进程间通信的方式,它允许一个进程向消息队列中发送消息,同时其他进程可以从该消息队列中读取这些消息。使用System V消息队列需要使用以下函数:
- msgget:创建或打开一个消息队列。
- msgsnd:向一个消息队列中发送消息。
- msgrcv:从一个消息队列中读取消息。
- msgctl:控制一个消息队列。
下面是一个示例程序,演示了如何使用System V消息队列进行进程间通信:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MAX_TEXT 512
struct msgbuf {
long mtype;
char mtext[MAX_TEXT];
};
int main()
{
struct msgbuf buf;
int msqid;
key_t key;
if ((key = ftok("msgq.txt", 'B')) == -1) {
perror("ftok");
exit(1);
}
if ((msqid = msgget(key, 0644 | IPC_CREAT)) == -1) {
perror("msgget");
exit(1);
}
printf("Enter lines of text, ^D to quit:\n");
buf.mtype = 1;
while(fgets(buf.mtext, MAX_TEXT, stdin) != NULL) {
int len = strlen(buf.mtext);
if (buf.mtext[len-1] == '\n') {
buf.mtext[len-1] = '\0';
}
if (msgsnd(msqid, &buf, len+1, 0) == -1) {
perror("msgsnd");
}
}
if (msgctl(msqid, IPC_RMID, NULL) == -1) {
perror("msgctl");
exit(1);
}
return 0;
}
```
2. POSIX消息队列
POSIX消息队列是Linux提供的另一种消息队列实现方式,与System V消息队列相比,POSIX消息队列更加灵活和易于使用。使用POSIX消息队列需要使用以下函数:
- mq_open:创建或打开一个消息队列。
- mq_send:向一个消息队列中发送消息。
- mq_receive:从一个消息队列中读取消息。
- mq_unlink:删除一个消息队列。
下面是一个示例程序,演示了如何使用POSIX消息队列进行进程间通信:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <mqueue.h>
#define MAX_TEXT 512
int main()
{
mqd_t mqd;
struct mq_attr attr;
char buffer[MAX_TEXT];
int len;
if ((mqd = mq_open("/test", O_CREAT | O_WRONLY, 0644, NULL)) == -1) {
perror("mq_open");
exit(1);
}
printf("Enter lines of text, ^D to quit:\n");
while(fgets(buffer, MAX_TEXT, stdin) != NULL) {
len = strlen(buffer);
if (buffer[len-1] == '\n') {
buffer[len-1] = '\0';
}
if (mq_send(mqd, buffer, len+1, 0) == -1) {
perror("mq_send");
}
}
if (mq_close(mqd) == -1) {
perror("mq_close");
exit(1);
}
if (mq_unlink("/test") == -1) {
perror("mq_unlink");
exit(1);
}
return 0;
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)