recvmmsg示例代码
时间: 2024-10-25 09:06:38 浏览: 21
`recvmmsg`是Linux系统提供的一种高级消息队列接收功能,它允许用户一次性从套接字接收多个消息。下面是一个简单的`recvmmsg`的C语言示例代码,假设我们有一个已经设置好并监听的消息队列:
```c
#include <sys/socket.h>
#include <sys/mman.h>
#include <linux/types.h>
#include <linux/mqueue.h>
#include <sys/un.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#define QUEUE_NAME "/tmp/my_queue"
#define MSG_SIZE 1024
int main() {
int sock = socket(AF_UNIX, SOCK_SEQPACKET, 0);
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, QUEUE_NAME, sizeof(addr.sun_path) - 1);
if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("Bind failed");
return -1;
}
if (listen(sock, 5) < 0) {
perror("Listen failed");
close(sock);
return -1;
}
char msg[MSG_SIZE];
struct msghdr mmsg;
struct iovec iov;
iov.iov_base = msg;
iov.iov_len = MSG_SIZE;
mmsg.msg_name = NULL;
mmsg.msg_namelen = 0;
mmsg.msg_iov = &iov;
mmsg.msg_iovlen = 1;
mmsg.msg_control = NULL;
mmsg.msg_controllen = 0;
mmsg.msg_flags = 0;
while (true) {
ssize_t len = recvmsg(sock, &mmsg, 0);
if (len <= 0) {
perror("recvmsg error");
break;
}
printf("Received message: %s\n", msg);
}
close(sock);
return 0;
}
```
这个示例创建了一个Unix域socket,并等待来自其他进程的消息。当有消息可用时,它会使用`recvmmsg`函数接收。注意实际使用时需要添加错误处理和可能的中断条件。
阅读全文