123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- #include <pthread.h>
- #include <mqueue.h>
- #include <sys/fcntl.h>
- void child(void* parameter)
- {
- char msg[16];
- ssize_t len;
- mqd_t mq;
- int i;
- char expect;
-
- printf("Child here!\n");
-
- if((mq = mq_open("Q001", O_RDONLY, 0, 0)) == -1)
- {
- printf("mq_open = %d\n", errno);
- pthread_exit(0);
- }
- else printf("mq = %x\n", &mq);
- for(expect = 'V'; expect <= 'Z'; ++expect)
- {
- memset(msg, 0, sizeof(msg));
- printf("Child waiting...\n");
- if((len = mq_receive(mq, msg, sizeof(msg), 0)) == -1)
- {
- printf("mq_receive = %d\n", errno);
- pthread_exit(0);
- }
- else printf("GOT MESSAGE %c!\n", expect);
- if(len != 8)
- printf("expected len 8 got %d\n", len);
-
- for(i = 0; i < 8; ++i)
- if(msg[i] != expect)
- printf("msg[%d] got %c expected %c\n", i, msg[i], expect);
- }
-
- if(mq_close(mq) == -1)
- printf("mq_close failed\n");
-
- printf("child done\n");
- pthread_exit(0);
- }
- void send(void* parameter)
- {
- mqd_t mq;
- char msg[8];
- printf("Send here!\n");
- if((mq = mq_open("Q001", O_WRONLY, 0, 0)) == -1)
- {
- printf("mq_open = %d\n", errno);
- pthread_exit(0);
- }
- else printf("mq = %x\n", &mq);
- /* task will be blocked waiting for message */
- memset(msg, 'Z', 8);
- if(mq_send(mq, msg, 8, 0) == -1)
- printf("mq_send = %d\n", errno);
- if(mq_close(mq) == -1)
- printf("mq_close failed\n");
- printf("Send done\n");
- pthread_exit(0);
- }
- void test_thread(void* parameter)
- {
- struct mq_attr attr;
- mqd_t mq;
- char msg[8];
- pthread_t pthrId;
-
- printf("Main here!\n");
- attr.mq_flags = 0;
- attr.mq_maxmsg = 3;
- attr.mq_msgsize = 16;
- if((mq = mq_open("Q001", O_CREAT | O_RDWR, 0, &attr)) == -1)
- {
- printf("mq_open = %d\n", errno);
- pthread_exit(0);
- }
- else printf("mq = %x\n", &mq);
-
- memset(msg, 'V', 8);
- if(mq_send(mq, msg, 8, 0) == -1)
- printf("mq_send = %d\n", errno);
- memset(msg, 'W', 8);
- if(mq_send(mq, msg, 8, 0) == -1)
- printf("mq_send = %d\n", errno);
- memset(msg, 'X', 8);
- if(mq_send(mq, msg, 8, 0) == -1)
- printf("mq_send = %d\n", errno);
- if(pthread_create(&pthrId, 0, &child, 0)!=0)
- {
- printf("pthread_create Child = %d\n", errno);
- pthread_exit(0);
- }
- /* Should block */
- printf("send Y\n");
- memset(msg, 'Y', 8);
- if(mq_send(mq, msg, 8, 0) == -1)
- printf("mq_send = %d\n", errno);
- else printf("sent Y\n");
- if(pthread_create(&pthrId, 0, send, 0)!=0)
- {
- printf("pthread_create Send = %d\n", errno);
- pthread_exit(0);
- }
- if(mq_close(mq) == -1)
- printf("mq_close failed\n");
- printf("main done\n");
- pthread_exit(0);
- }
- #include <finsh.h>
- void libc_mq()
- {
- rt_thread_t tid;
- tid = rt_thread_create("mqtest", test_thread, RT_NULL,
- 2048, 20, 5);
- if (tid != RT_NULL)
- {
- rt_thread_startup(tid);
- }
- }
- FINSH_FUNCTION_EXPORT(libc_mq, mqueue test);
|