QNX中的消息传递示例

QNX不同进程间的消息传递机制主要有以下几种:

  • 消息传递(基于服务器和客户端模型)
  • 信号量
  • 共享内存
  • 消息队列

    • POSIX通过message queues定义一组非阻塞的消息传递机制。消息队列为命名对象,针对这些对象可以进行读取和写入,作为离散消息的优先级队列,消息队列具有比管道更多的结构,为应用程序提供了更多的通信控制。QNX Neutrino内核不包含message queues,它的实现在内核之外。

共享内存提供了最高带宽的IPC机制,一旦创建了共享内存对象,访问对象的进程可以使用指针直接对其进行读写操作。共享内存本身是不同步的,需要结合同步原语一起使用,信号量和互斥锁都适合与共享内存一块使用,信号量一般用于进程之间的同步,而互斥锁通常用于线程之间的同步,通通常来说互斥锁的效率会比信号量要高。

所以将共享内存和信号量进行组合,完成进程间的消息传递和同步的功能。

客户端传递数据给服务器,并且在服务器完成相应的数据处理工作。

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <semaphore.h>
#include <fcntl.h>
#include "../Z_shm_Creat/shmem.h"
char        *progname = "shmemuser";
int main(int argc, char *argv[]) {
   int     fd;
   shmem_t *ptr;
   char * name = "/q3";
   fd = shm_open(name, O_RDWR, S_IRWXU);
   if (fd == -1) {
       printf("%s: error opening the shared memory object: %s\n",
               progname,  strerror(errno));
       exit(EXIT_FAILURE);
   }
   /* Get a pointer to the shared memory object */
   ptr = mmap(0, sizeof(shmem_t),
           PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
   for(;;){
       sem_wait(&ptr->semConnect);
       pthread_mutex_lock(&ptr->myshmemmutex);
       printf("%s: text is '%s'\n", progname, ptr->text);
       printf("baba is %d\n",ptr->baba);

       /* Of course we need to unlock the mutex, to allow
        * other programs to access the shared memory region */
       sleep(4);
       pthread_mutex_unlock(&ptr->myshmemmutex);
   }
   close(fd);
   munmap(ptr, sizeof(shmem_t));
   return (EXIT_SUCCESS);
}

当服务器获得到客户端传递过来的信号之后,在进行读取共享内存区的操作,不然就一致处于阻塞的状态。服务器必须在两次信号抵达的中间完成数据的处理工作,不然客户端在下一次传递sem时会更改共享内存区的变量值,那么服务器就会丢失一帧的数据。

也就是说该进程的处理时间必须要在两次中断以内。