Chinaunix首页 | 论坛 | 博客
  • 博客访问: 514624
  • 博文数量: 77
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 689
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-12 08:40
文章分类

全部博文(77)

文章存档

2018年(1)

2016年(3)

2015年(24)

2014年(49)

我的朋友

分类: 嵌入式

2014-08-29 09:55:51

    *********************************************************************************************************************************
    最近
做了一个消息队列后台(main),使用 ftok(".",'k') 获取key值,在当前目录下执行:./main &
    另一个发消息的脚本(sendmsg),同样的方式获取key值,用绝对目录执行:/geo/app/scripts/sendmsg  xxx ...

    结果main接收不到消息,后经过排查,错在执行使用目录上。要么使用同一 “./” ,要么固定key值。
    *********************************************************************************************************************************

    System V 进程间通信(IPC)包括3种机制:消息队列、信号量、共享内存。消息队列和信号量均是内核空间的系统对象,经由它们的数据需要在内核和用户空间进行额外 的数据拷贝;而共享内存和访问它的所有应用程序均同处于用户空间,应用进程可以通过地址映射的方式直接读写内存,从而获得非常高的通信效率。

    每一个IPC资源有两个唯一的标志与之相连:关键字和标识.

    1.关键字
 
    类型是一个key_t的长整型.用来命名要使用的IPC资源,以便可以被多个进程引用.进程通过指定一个关键字调用xxxget()函数可获得一个IPC资源的标识,就像指定文件名调用open获得文件描述字一样.

    key_t ftok(const char *pathname, int proj_id);
ftok 函数用于生成一个键值:key_t key,该键值将作为消息队列/共享内存对象的唯一 性标识符,并提供给为msgget/shmget函数作为其输入参数;ftok 函数的输入参数包括一个文件(或目录)路径名:pathname,以及一个额外的数字:proj_id,其中pathname所指定的文件(或目录)要求 必须已经存在,且proj_id不可为0(低8位有效);
    

  ftok的陷阱

    根据pathname指定的文件(或目录)名称,以及proj_id参数指定的数字,ftok函数为IPC对象生成一个唯一性的键值。在实际应用中,很容易产生的一个理解是,在proj_id相同的情况下,只要文件(或目录)名称不变,就可以确保ftok返回始终一致的键值。然而,这个理解并非完全正确,有可能给应用开发埋下很隐晦的陷阱。因为ftok的实现存在这样的风险,即在访问同一消息队列/共享内存的多个进程先后调用ftok函数的时间段中,如果 pathname指定的文件(或目录)被删除且重新创建,则文件系统会赋予这个同名文件(或目录)新的i节点信息,于是这些进程所调用的ftok虽然都能 正常返回,但得到的键值却并不能保证相同由此可能造成的后果是,原本这些进程意图访问一个相同的共享内存对象,然而由于它们各自得到的键值不同,实际上进程指向的共享内存不再一致;如果这些共享内存都得到创建,则在整个应用运行的过程中表面上不会报出任何错误,然而通过一个共享内存对象进行数据传输的目 的将无法实现。

    避免此类问题最根本的方法,就是采取措施保证pathname所指定的文件(或目录)在共享内存的使用期间不被删除,不要使用有可能被删除的文件;或者干脆直接指定键值,而不借助ftok来获取键值(#define )


    2.标识
 
    每一个独立的消息队列,信号量集合和共享存储段都由一个唯一的正整数所标识.如果说关键字类似于文件名,那么表示就类似于文件描述字.
 
    标识对于不同类型是独立的.也就是消息队列和信号量的都有一个标识,那么这两个类型标识值可以相同.

    int msgid;
    msgid =  msgget(key_t key, int msgflg); // 可直接指定键值(#define key 0X8888)
阅读(1804) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~