mq_receive 与mq_send
简要补充:
mq_receive 的len参数的值不能小于指定消息队列中的消息的最大大小,即使为attr.mq_msgsize-1也会返回错误!!!
代码
myhead.h
#ifndef MYHEAD_H_
#define MYHEAD_H_
#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<mqueue.h>
#define MAXLINE 4096
#define FILE_MODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
#endif
mqsend.c
#include"myhead.h"
#define uint_t unsigned int
int main(int argc, char ** argv)
{
mqd_t mqd;
void *ptr;
size_t len;
uint_t prio;
if(argc != 4)
{
printf("ex: ./mqsend <name> len prio\n");
return 0;
}
len = atoi(argv[2]);;
prio = atoi(argv[3]);
mqd = mq_open(argv[1], O_WRONLY);
if(mqd < 0)
perror("error mqd\n");
ptr = calloc(len, sizeof(char));
mq_send(mqd, ptr, len, prio);
if(errno != 0)
perror("send fail\n");
return 0;
}
mqrece.c
#include"myhead.h"
#define uint_t unsigned int
int main(int argc, char **argv)
{
int c, flags;
mqd_t mqd;
ssize_t n;
uint_t prio;
void *buff;
struct mq_attr attr;
flags = O_RDONLY;
while(-1 != (c = getopt(argc, argv, "n")))
{
switch(c)
{
case 'n':
flags |= O_NONBLOCK;
break;
case '?':
perror("bad option");
}
}
if(optind != argc -1)
{
printf("optind error");
return -1;
}
mqd = mq_open(argv[optind], flags);
mq_getattr(mqd, &attr);
buff = malloc(attr.mq_msgsize);
n = mq_receive(mqd, buff, attr.mq_msgsize, &prio);
printf("read %ld ,prio %u\n", (long)n, prio);
return 0;
}