QNX系列:二、消息传递:一个例子

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时会更改共享内存区的变量值,那么服务器就会丢失一帧的数据。

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

擦擦擦大侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值