Ads 468x60px

##EasyReadMore##

29 4月, 2016

[C/C++] Message queue

程式:

common.h

  1. #ifndef COMMON_H_  
  2. #define COMMON_H_  
  3.   
  4. #define QUEUE_NAME  "/test_queue"  
  5. #define MAX_SIZE    1024  
  6. #define MSG_STOP    "exit"  
  7.   
  8. #define CHECK(x) \  
  9.     do { \  
  10.         if (!(x)) { \  
  11.             fprintf(stderr, "%s:%d: ", __func__, __LINE__); \  
  12.             perror(#x); \  
  13.             exit(-1); \  
  14.         } \  
  15.     } while (0) \  
  16.   
  17. #endif /* #ifndef COMMON_H_ */  

Receive 端:

  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include <string.h>  
  4. #include <sys/stat.h>  
  5. #include <sys/types.h>  
  6. #include <errno.h>  
  7. #include <mqueue.h>  
  8.   
  9. #include "common.h"  
  10.   
  11. int main(int argc, char **argv)  
  12. {  
  13.     mqd_t mq;  
  14.     struct mq_attr attr;  
  15.     char buffer[MAX_SIZE + 1];  
  16.     int must_stop = 0;  
  17.   
  18.     /* initialize the queue attributes */  
  19.     attr.mq_flags = 0;  
  20.     attr.mq_maxmsg = 10;  
  21.     attr.mq_msgsize = MAX_SIZE;  
  22.     attr.mq_curmsgs = 0;  
  23.   
  24.     /* create the message queue */  
  25.     mq = mq_open(QUEUE_NAME, O_CREAT | O_RDONLY, 0644, &attr);  
  26.     CHECK((mqd_t)-1 != mq);  
  27.   
  28.     do {  
  29.         ssize_t bytes_read;  
  30.   
  31.         /* receive the message */  
  32.         bytes_read = mq_receive(mq, buffer, MAX_SIZE, NULL);  
  33.         CHECK(bytes_read >= 0);  
  34.   
  35.         buffer[bytes_read] = '\0';  
  36.         if (! strncmp(buffer, MSG_STOP, strlen(MSG_STOP)))  
  37.         {  
  38.             must_stop = 1;  
  39.         }  
  40.         else  
  41.         {  
  42.             printf("Received: %s\n", buffer);  
  43.         }  
  44.     } while (!must_stop);  
  45.   
  46.     /* cleanup */  
  47.     CHECK((mqd_t)-1 != mq_close(mq));  
  48.     CHECK((mqd_t)-1 != mq_unlink(QUEUE_NAME));  //delete queue file
  49.   
  50.     return 0;  
  51. }  

Send 端:

  1. #include <stdlib.h>  
  2. #include <stdio.h>  
  3. #include <string.h>  
  4. #include <sys/stat.h>  
  5. #include <sys/types.h>  
  6. #include <mqueue.h>  
  7.   
  8. #include "common.h"  
  9.   
  10.   
  11. int main(int argc, char **argv)  
  12. {  
  13.     mqd_t mq;  
  14.     char buffer[MAX_SIZE];  
  15.   
  16.     /* open the mail queue */  
  17.     mq = mq_open(QUEUE_NAME, O_WRONLY);  
  18.     CHECK((mqd_t)-1 != mq);  
  19.   
  20.     printf("Send to server (enter \"exit\" to stop it):\n");  
  21.   
  22.     do {  
  23.         printf("> ");  
  24.         fflush(stdout);  
  25.   
  26.         memset(buffer, 0, MAX_SIZE);  
  27.         fgets(buffer, MAX_SIZE, stdin);  
  28.   
  29.         /* send the message */  
  30.         CHECK(0 <= mq_send(mq, buffer, MAX_SIZE, 0));  
  31.   
  32.     } while (strncmp(buffer, MSG_STOP, strlen(MSG_STOP)));  
  33.   
  34.     /* cleanup */  
  35.     CHECK((mqd_t)-1 != mq_close(mq));  
  36.   
  37.     return 0;  
  38. }  

Compiler value:

gcc -o server server.c -lrt
gcc -o client client.c -lrt

Explain:

mq_open:
     O_RDONLY Open the message queue for receiving messages. The process
can use the returned message queue descriptor with
mq_receive(), but not mq_send().  A message queue may be open
multiple times in the same or different processes for receiv-
ing messages.

     O_WRONLY Open the queue for sending messages.  The process can use the
returned message queue descriptor with mq_send() but not
mq_receive(). A message queue may be open multiple times in
the same or different processes for sending messages.

     O_RDWR Open the queue for both receiving and sending messages.  The
process can use any of the functions allowed for O_RDONLY and
O_WRONLY.  A message queue may be open multiple times in the
same or different processes for sending messages.

結果:

Receive 端:

Received: oknow

Received: hello

Send 端:

Send to server (enter "exit" to stop it):
> oknow
> hello

Refer:
c - Weird posix message queue linking issue - sometimes it doesn't link correctly - Stack Overflow - http://goo.gl/6ST3DH
How do I use mqueue in a c program on a Linux based system? - Stack Overflow - http://goo.gl/VBLRCG
mq_open - http://goo.gl/g9iOab

0 意見:

張貼留言

 
Blogger Templates