我想使用两个线程到线程队列发送和接收消息。但是我也不能创建队列。我创建散文时,孩子工作。我可以在主进程和子进程之间发送和读取消息,但是我无法在线程之间工作。为什么?
来源:
#include <fcntl.h>
#include <mqueue.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include "tm_api.h"
#define QUEUE_NAME "/testqueue"
#define MAX_SIZE 1024
static void * queue_server(void *pars);
static void * queue_client(void *parc);
static void * queue_server(void *pars) {
mqd_t mq;
unsigned int sender;
int bytes_read;
struct mq_attr attr;
char buffer[MAX_SIZE];
attr.mq_flags = 0;
attr.mq_maxmsg = 10;
attr.mq_msgsize = MAX_SIZE;
attr.mq_curmsgs = 0;
mq = mq_open(QUEUE_NAME, O_CREAT | O_RDONLY | O_NONBLOCK, 0644, &attr);
printf("mq_receive : %d\n", mq);
memset(buffer, 0x00, sizeof(buffer));
mq_unlink (QUEUE_NAME);
while(1) {
bytes_read = mq_receive(mq, buffer, MAX_SIZE, &sender);
if(bytes_read >= 0) {
printf("SERVER: Received message: %s\n", buffer);
} else {
printf("SERVER: None \n");
}
fflush(stdout);
tm_thread_sleep(1);
}
mq_close(mq);
mq_unlink(QUEUE_NAME);
return NULL;
}
static void * queue_client(void *parc) {
mqd_t mq;
char buffer[MAX_SIZE];
mq = mq_open(QUEUE_NAME, O_RDWR);
printf("mq_send : %d\n", mq);
int count = 0;
while(1) {
snprintf(buffer, sizeof(buffer), "MESSAGE %d", count++);
printf("CLIENT: Send message... \n");
mq_send(mq, buffer, MAX_SIZE+1, 0);
fflush(stdout);
tm_thread_sleep(1);
}
mq_close(mq);
return NULL;
}
int main() {
pthread_t client, server;
printf("Start...\n");
pthread_create(&server, NULL, &queue_server, NULL);
pthread_create(&client, NULL, &queue_client, NULL);
pthread_join(server, NULL);
pthread_join(client, NULL);
printf("Done...\n");
return (EXIT_SUCCESS);
}
输出:
Start... mq_receive :3 SERVER: None mq_send : -1 CLIENT: Send message... SERVER: None CLIENT: Send message... SERVER: None
答案 0 :(得分:0)
这里的问题是, 您发送的内容超出了缓冲区的大小。
mq_send(mq, buffer, MAX_SIZE+1, 0);
应该是
mq_send(mq, buffer, MAX_SIZE, 0);
如果您已经验证了mq_send的返回值,则可能已经知道了。正在返回
修改后,我可以得到以下输出。
Start...
mq_send : 4
mq_receive : 3
CLIENT: Send message...
SERVER: Received message: MESSAGE 0
CLIENT: Send message...
SERVER: Received message: MESSAGE 1
CLIENT: Send message...
SERVER: Received message: MESSAGE 2
CLIENT: Send message...
SERVER: Received message: MESSAGE 3
找到以下完整的代码。
#include <fcntl.h>
#include <mqueue.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#define QUEUE_NAME "/testqueue"
#define MAX_SIZE 1024
static void * queue_server(void *pars);
static void * queue_client(void *parc);
static void * queue_server(void *pars) {
mqd_t mq;
unsigned int sender;
int bytes_read;
struct mq_attr attr;
char buffer[MAX_SIZE];
attr.mq_flags = 0;
attr.mq_maxmsg = 10;
attr.mq_msgsize = MAX_SIZE;
attr.mq_curmsgs = 0;
mq = mq_open(QUEUE_NAME, O_RDONLY | O_NONBLOCK | O_CREAT, 0666, &attr);
printf("mq_receive : %d\n",mq);
printf("SERVER: None %d %d \n", errno, bytes_read);
memset(buffer, 0x00, sizeof(buffer));
mq_unlink (QUEUE_NAME);
while(1) {
bytes_read = mq_receive(mq, buffer, MAX_SIZE, &sender);
if(bytes_read >= 0) {
printf("SERVER: Received message: %s\n", buffer);
} else {
printf("SERVER: None %d %d \n", errno, bytes_read);
}
// fflush(stdout);
sleep(1);
}
mq_close(mq);
mq_unlink(QUEUE_NAME);
return NULL;
}
static void * queue_client(void *parc) {
mqd_t mq;
char buffer[MAX_SIZE];
struct mq_attr attr;
attr.mq_flags = 0;
attr.mq_maxmsg = 10;
attr.mq_msgsize = MAX_SIZE;
attr.mq_curmsgs = 0;
mq = mq_open(QUEUE_NAME, O_CREAT|O_WRONLY|O_NONBLOCK , 0666,&attr);
printf("mq_send : %d\n",mq);
int count = 0;
while(1) {
snprintf(buffer, sizeof(buffer), "MESSAGE %d", count++);
printf("CLIENT: Send message... \n");
int bytes_read = mq_send(mq, buffer, MAX_SIZE, 0);
printf("CLIENT: send %d %d \n", errno, bytes_read);
// fflush(stdout);
sleep(1);
}
mq_close(mq);
return NULL;
}
int main() {
pthread_t client, server;
printf("Start...\n");
pthread_create(&server, NULL, &queue_server, NULL);
pthread_create(&client, NULL, &queue_client, NULL);
pthread_join(server, NULL);
pthread_join(client, NULL);
printf("Done...\n");
return (EXIT_SUCCESS);
}