2017-06-20 8 views
0

私は、単純なmsgキューの動作を習得しようとするLinuxプログラミングには新しいです。 しかし、以下のメッセージは長い間、エラーメッセージが表示されます。mq_receiveがメッセージを長すぎると言っています

私は同じような質問を何度も聞いていますが、コードを掲示して私のprobelmに解決策を見つけることができませんでした。

#include <stdio.h> 
#include <pthread.h> 
#include <fcntl.h>   
#include <sys/stat.h>   
#include <mqueue.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <errno.h> 

void* producerThRoutine (void *arg); 
void* ConsumerThRoutine (void *arg); 

int main() 
{ 
    int retVal = 0; 
    pthread_t producerThId,consumerThID; 
    mqd_t myMQdes; 
    struct mq_attr attr; 

    attr.mq_flags = 0; 
    attr.mq_maxmsg = 1024; 
    attr.mq_msgsize = 10; 
    attr.mq_curmsgs = 0; 

    myMQdes = mq_open("/myMessageQueue",O_CREAT | O_RDWR,S_IWUSR | S_IRUSR,&attr); 
    if(myMQdes == (mqd_t) -1){ 
    perror("Message Queue creation failed\n"); 
    exit(EXIT_FAILURE); 
    } 

    retVal = pthread_create(&producerThId,NULL,producerThRoutine,&myMQdes); 
    if(retVal != 0){ 
    perror("\n producerThRoutine creation failed \n"); 
    exit(EXIT_FAILURE); 
    } 

    retVal = pthread_create(&consumerThID,NULL,ConsumerThRoutine,&myMQdes); 
    if(retVal != 0){ 
    perror("\n ConsumerThRoutine creation failed \n"); 
    exit(EXIT_FAILURE); 
    } 

    retVal = pthread_join(producerThId,NULL); 
    if(retVal != 0){ 
    perror("\n pthread_join for producer thread failed \n"); 
    exit(EXIT_FAILURE); 
    } 

    retVal = pthread_join(consumerThID,NULL); 
    if(retVal != 0){ 
    perror("\n pthread_join for consumer thread failed \n"); 
    exit(EXIT_FAILURE); 
    } 
    mq_close(myMQdes); 
    mq_unlink("/myMessageQueue"); 
    return 0; 
} 


void* producerThRoutine (void *arg) 
{ 
    char c; 
    char EOS = '\0'; 
    int retVal; 
    mqd_t *pMQDes = (mqd_t *) arg; 
    printf("Enter the string you want to convert to upper case \n"); 

    while((c=getchar()) != EOF){ 
    if(c == '\n'){ 
     retVal = mq_send((*pMQDes),&EOS,sizeof(char),1); 
     if(retVal != 0){ 
      perror("sending EOS to queue failed \n"); 
      exit(EXIT_FAILURE);   
     } 
     break; 
    }  
    retVal = mq_send((*pMQDes),&EOS,sizeof(char),1); 
    if(retVal != 0){ 
     perror("sending character to queue failed \n"); 
     break ;   
    } 
    } 
} 

void* ConsumerThRoutine (void *arg) 
{ 
    char msg; 
    int msg_priority,retVal; 

    mqd_t *pMQDes = (mqd_t *) arg; 

    while(1){ 
    printf("\nthe converted string is : "); 

RETVAL =エラーmq_receive(* pMQDes、& MSG、はsizeof(文字)、& msg_priority)。

if(retVal == -1){ 
     perror("mq_receive failed");  
     exit(EXIT_FAILURE); 
    } 
    if(msg == '\0') 
    { 
     break; 
    } 
    putchar(toupper(msg)); 
    } 
} 
+0

エラーを示すコード行を指定し、エラーメッセージをコピーして貼り付けてください。 – nos

+0

エラーラインはハイライトされています – haris

答えて

1

私はエラーmq_receiveのmanページをチェックして、エラーの一つは、以下のように示されている:

EMSGSIZE 
      msg_len was less than the mq_msgsize attribute of the message queue. 

と私は

retVal = mq_receive (*pMQDes,&msg,sizeof(char),&msg_priority); 

を変更します
retVal = mq_receive (*pMQDes,&msg,1024 * sizeof(char),&msg_priority); 

ここで、1024は設定したmq_msgsizeです。その後、エラーは消えます。

+0

実際には、1024個の要素を持つ配列を渡すべきであることに注意してください。今では 'msg'は単なる1文字です。 – nos

+0

申し訳ありませんが、 'mq_msgsize'は10です。値は10に設定するのが最善です。 – slzy

関連する問題