C Posix消息队列接收/发送/打开不工作?

C Posix消息队列接收/发送/打开不工作?,c,pthreads,posix,message-queue,C,Pthreads,Posix,Message Queue,我希望使用两个线程到线程队列发送和接收消息。但我也不能创建队列。当我创作一部散文时,这孩子在工作。我可以在主进程和子进程之间发送和读取消息,但不能在线程之间工作。为什么? 资料来源: 输出: 问题是,, 您发送的数据超过了缓冲区的大小 mq_send(mq, buffer, MAX_SIZE+1, 0); 应该是 mq_send(mq, buffer, MAX_SIZE, 0); 如果您已经验证了mq_send的返回值,您就可以找到它。它回来了 定义EMSGSIZE 90/*

我希望使用两个线程到线程队列发送和接收消息。但我也不能创建队列。当我创作一部散文时,这孩子在工作。我可以在主进程和子进程之间发送和读取消息,但不能在线程之间工作。为什么?

资料来源:

输出:

问题是,, 您发送的数据超过了缓冲区的大小

    mq_send(mq, buffer, MAX_SIZE+1, 0);
应该是

    mq_send(mq, buffer, MAX_SIZE, 0);
如果您已经验证了mq_send的返回值,您就可以找到它。它回来了

定义EMSGSIZE 90/*消息太长*/错误。 修改后,我能够得到以下输出

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);
}

否。问题仍然存在。您遇到了什么错误?尝试在mq_发送后打印错误号。如果您得到errno=9 EBADF,请尝试关闭该程序并再次运行。@aytac是否仍看到问题?对于发送,我在mq_open函数之后添加了strerrorno。输出没有这样的文件或目录。。。错误:2没有这样的文件或目录。我想我们同时解决了它我意识到我无法添加。它现在正在工作。如果需要,请编辑您的邮件。我会投票。
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);
}