mq notify 返回 -1,不通知何时应该

问题描述

我的 mq_notify 有问题,当消息队列中有要读取的内容时没有通知我。

这是我的代码

void * mqClient(void * arg){
    pthread_mutex_lock(&mutex);

    int errnum;
    int retval;

    char thread_id[30];
    char thread_id2[30] = "/";

    sprintf(thread_id,"%d",pthread_self());

    strcat(thread_id2,thread_id);

    printf("\nEnter planet name: ");
    scanf("%s",planet.name);

    printf("\nEnter planet X-position: ");
    scanf("%lf",&planet.sx);

    printf("\nEnter planet Y-position: ");
    scanf("%lf",&planet.sy);

    printf("\nEnter planet X-veLocity: ");
    scanf("%lf",&planet.vx);

    printf("\nEnter planet Y-veLocity: ");
    scanf("%lf",&planet.vy);

    printf("\nEnter planet mass: ");
    scanf("%lf",&planet.mass);

    printf("\nEnter planet life time: ");
    scanf("%d",&planet.life);

    strcpy(planet.pid,thread_id2);

    mqd_t mq_on_server;
    usleep(1000);

    int response = MQconnect(&mq_on_server,"/servermq");

    if(response == 0)
        printf("Something went wrong with MQconnect\n");
    else
        MQwrite (mq_on_server,&planet);

    strcat(thread_id2,thread_id);

    //Create a messagequeue responsible for sending server-client specific messages

     int response2 = MQcreate(&clientMQ,planet.pid);

     if(response2 != 1)
         printf("\nNO success in creating a message queue between client and server!");
     else
     {
         printf("\nSUCCESS in creating a message queue (%s) between client and server!\n",planet.pid);
     }

    printf("\n---------------------------------------");

    sev.sigev_notify = SIGEV_THREAD;
    sev.sigev_notify_function = sigNotifier;
    sev.sigev_notify_attributes = NULL;
    sev.sigev_value.sival_ptr = &response2;

    retval = mq_notify(response2,&sev);

    printf("\n%d",retval);

    if(retval < 0)
    {
        errnum = errno;
        fprintf(stderr,"Value of errno: %d\n",errno);
        perror("Error printed by perror");
        fprintf(stderr,"Notification Failed: %s\n",strerror(errnum));
        fflush(stdout);
    }

    /*int c;
    while ( (c = getchar()) != '\n' && c != EOF);*/

    pthread_mutex_unlock(&mutex);

    return NULL;
}

和 sigNotifier:

static void sigNotifier(union sigval sv)
{

        printf("Notification!");

        char msg[1000];

        MQread(clientMQ,msg);

        printf("\nMessage received from server: %s",msg);
}

错误值:

Value of errno: 9
Error printed by perror: Bad file descriptor
Notification Failed: Bad file descriptor

我总是从 mq_notify 得到返回值 -1。我的代码中是否遗漏了什么?

服务器写入消息队列没有问题。我已经检查过客户端可以从消息队列中读取并且它可以但是我希望它只在有东西要读取时才从消息队列中读取。我的问题是程序卡在 MQread 上,直到有东西要读,但我不想要这种行为,因此我认为信号处理程序可以解决这个问题。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)