`
boisterous
  • 浏览: 62874 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类

ftok学习

阅读更多
系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值。通常情况下,该id值通过ftok函数得到。
ftok原型如下:
key_t ftok( char * fname, int id )
fname就时你指定的文件名,id是子序号。

在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。

如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成16进制为0x26,则最后的key_t返回值为0x26010002。
查询文件索引节点号的方法是: ls -i

当删除重建文件后,索引节点号由操作系统根据当时文件系统的使用情况分配,因此与原来不同,所以得到的索引节点号也不同。

如果要确保key_t值不变,要目确保ftok的文件不被删除,要么不用ftok,指定一个固定的key_t值,比如:

#define IPCKEY 0x111

char path[256];

    sprintf( path, "%s/etc/config.ini", (char*)getenv("HOME") );
    msgid=ftok( path, IPCKEY );

同一段程序,用于保证两个不同用户下的两组相同程序获得互不干扰的IPC键值。
由于etc/config.ini(假定)为应用系统的关键配置文件,因此不存在被轻易删除的问题——即使被删,也会很快被发现并重建(此时应用系统也将被重起)。
ftok()的设计目的也在于此。

下面是一段具体的代码例子:

key_t keyShareMem ; 
if((keyShareMem = ftok(AFC_SHARE_MEMORY_NAME.c_str(), 0)) == -1) {
  cerr << "ERROR:"<< m_nThisThreadType<<" CBaseMessageDeal() keyShareMem ftok: " << errno << ":" << strerror(errno)<<endl;
  throw new AfcInitAfcResourceException("CBaseMessageDeal::CBaseMessageDeal ftok keyShareMem") ;
}
if ( (m_shmID = shmget(keyShareMem, 0, AFC_SHM_RW)) < 0)  {
  cerr << "ERROR:"<< m_nThisThreadType<<" CBaseMessageDeal() shmget exist: "<<errno <<":"<<strerror(errno)<<endl ;
  throw new AfcInitAfcResourceException("CBaseMessageDeal::CBaseMessageDeal() shmget exist") ;
}
if((m_afcShareMemoryBegin=(char *)shmat(m_shmID, NULL, 0)) == (void *) -1){
  cerr << "ERROR:"<< m_nThisThreadType<<" CBaseMessageDeal() shmat: " << errno << ":" << strerror(errno) << endl ;
  throw new AfcInitAfcResourceException("CBaseMessageDeal::CBaseMessageDeal shmat") ;
}
分享到:
评论

相关推荐

    linux系统调用之ftok()

    通常情况下,该id值通过ftok函数得到。 在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。 如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成...

    linux环境编程-ftok()函数详解.docx

    linux环境编程-ftok()函数详解.docx

    Shell脚本实现ftok函数

    主要介绍了Shell脚本实现ftok函数,ftok函数是操作系统底层中很有名的一个函数,本文讲在Shell中如何实现同样算法的函数,需要的朋友可以参考下

    IPC工作模式

    IPC简介,寄存器配置,工作模式介绍,最小使用,增加数据通路,增加动态分配,强大但易用的消息机制,欢迎指正批评。

    PHP多进程通信-消息队列使用

    $key=ftok(__FILE__,'a'); //获取消息队列 $queue=msg_get_queue($key,0666); //发送消息 //msg_send($queue, 1, Hello, 1); //接收消息,如果接收不到会阻塞 msg_receive($queue, 1, $message_type, 1024, $message...

    3_read.rar_return

    if((key = ftok( ./ ,0xa)) &lt; 0){ perror( ftok ) exit(1) } //鑾峰緱鍏变韩鍐呭瓨 if((shm_id = shmget(key,SHM_SIZE,IPC_CREAT|0644)) &lt; 0){ perror( shmget ) exit(1) } //寤虹珛鍏变韩...

    shared_memory_demo.zip

    System V 共享内存与信号量 C 语言示例代码 ,配套 Makefile 的设计和实现。 ftok(), shmget(), shmat() ftok(), semget(), semctl(), semop()

    PHP进程通信基础之信号量与共享内存通信

    由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂。...$ftok = ftok(__FILE__, 'a'); 2、创建信号量资源ID $sem_resouce_id = sem_get($ftok); 3、接受信号量 sem_acqure($sem_reso

    linux ipc的简单使用

    linux环境下ipc技术点的简单使用,包括ftok,msg相关函数的使用等

    Linux /Unix 共享内存

    共享内存的使用,主要有以下几个API:ftok()、shmget()、shmat()、shmdt()及shmctl()。 1)用ftok()函数获得一个ID号. 应用说明: 在IPC中,我们经常用用key_t的值来创建或者打开信号量,共享内存和消息队列。 函数...

    linux 共享内存浅析

    ftok()会返回一个key_t型的值,也就是计算出来的标识符的值。 shmkey = ftok( "mcut" , 'a' ); // 计算标识符 操作共享内存,我们用到了下面的函数 #include #include #include int shmget( key_t shmkey , int...

    常用函数1

    2、该路径是必须存在的,ftok只是根据文件inode在系统内的唯一性来取一个数值,和文件的权限无关 3、proj_id是可以根据自己的约定,随意设置 2、sh

    msgq:System V消息队列(IPC)Python扩展

    ftok:将路径名和项目标识符转换为System V IPC密钥 msgget:获取消息队列标识符 msgsnd:将消息发送到队列 msgrcv:从队列接收消息 msgctl:消息控制操作 有关系统调用的更多信息,请访问您的手册页。 这个想法是...

    进程管理与通信总结

    基础概念: 进程与程序区别:进程是程序的一次动态执行过程.进程在内存中运行,程序在磁盘中存储. 线程:LWP 进程的通信 BSD(高校):pipe、fifo、信号 System V:share memory、消息队列、信号灯(ftok) BSD:Socket

    PHP下操作Linux消息队列完成进程间通信的方法

    关于Linux系统进程通信的概念及实现可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/   关于Linux系统消息队列的概念及实现可查看:...php $message_queue_key = ftok(__

    PHP共享内存用法实例分析

    $shm_key = ftok(__FILE__, 't'); /** 开辟一块共享内存 int $key , string $flags , int $mode , int $size $flags: a:访问只读内存段 c:创建一个新内存段,或者如果该内存段已存在,尝试打开它进行读写 w:可...

    PHP消息队列用法实例分析

    $key = ftok(__DIR__, 'R'); #获取队列中的消息 $q = msg_get_queue($key); #删除队列 msg_remove_queue($q); #获取队列的状态信息 $status = msg_stat_queue($q); print_r($status); echo "\n"; for($i=0;$i&lt;100...

    php进程间通讯实例分析

    分享给大家供大家参考,具体如下: ...本例使用的是:生产者=&gt;消费者=&gt;收集器,的模式. ...$key = ftok(__FILE__, "a"); $queue = msg_get_queue($key); // 进程ID $producer_pid = 0; $consumers_pid =

    UNIX Network Programming Volume 2(Unix网络编程卷2英文版)

    3.2 key_t keys and ftok function 28 3.3 ipc_perm structure 30 3.4 creating and opening ipc channels 30 3.5 ipc permissions 32 3.6 identifier reuse 34 3.7 ipcs and ipcrm programs 36 3.8 kernel ...

Global site tag (gtag.js) - Google Analytics