系统建立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") ;
}
相关文章:
如何用ftok来产生相关的key_t值
分享到:
相关推荐
通常情况下,该id值通过ftok函数得到。 在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。 如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成...
### Shell脚本实现ftok函数 #### 概述 在多进程通信(Inter-Process Communication,简称IPC)中,ftok函数是一个非常重要的组件。它主要用于生成唯一的关键字(Key),以便不同进程能够通过该关键字识别同一共享...
Linux 环境编程-ftok() 函数详解 在 Linux 环境编程中,ftok 函数是一个非常重要的函数,它用于生成 IPC 通讯的 ID 值。在本文中,我们将详细介绍 ftok 函数的原型、参数、返回值、使用方法以及示例程序。 ftok ...
创建者可以使用 ftok 函数来生成一个 key 值,该函数将文件路径和一个整数值作为参数,返回一个 key 值。其他进程可以使用相同的文件路径和整数值来生成相同的 key 值,从而获取该 IPC 对象的 ID 值。 Ftok 函数 ...
ftok 函数用于生成一个唯一的键值,该键值可以用于创建或访问 IPC 对象,包括共享内存、消息队列和信号量。ftok 函数需要两个参数:pathname 和 proj_id。pathname 是一个存在的文件或目录名,而 proj_id 是一个非 0...
`key`参数通常由ftok函数生成,用于唯一标识消息队列;`flags`参数可以设置权限和创建模式。如果消息队列已存在,`msgget`将返回其标识符,否则创建一个新的队列。 2. **msgctl**: - `msgctl`函数用于控制消息...
通过ftok函数和msgget函数,读者可以学习如何创建和获取消息队列。文中还提供了使用msgsnd和msgrcv函数进行消息发送和接收的示例,以及如何通过msgctl函数对消息队列进行控制。 共享内存部分则从互斥访问的必要性讲...
ftok 函数将文件的索引节点号和子序号结合起来生成一个唯一的 IPC 关键字。 使用消息队列需要首先创建一个消息队列,可以使用 msgget 函数来创建。如果创建成功,将返回一个消息队列标识符(msgid)。然后可以使用...
在这两个程序中,使用 `ftok` 函数将文件名 "msg" 转换为一个标识符,然后使用该标识符创建消息队列。同时,它们还使用 `signal` 函数捕捉 SIGINT 和 SIGTERM 信号,以便在程序退出时删除消息队列。 Linux 消息队列...
* ftok 函数可以用于生成 IPC 关键字。 使用消息队列: * 使用消息队列可以实现消息传递。 * 消息队列可以实现进程间通信。 * 消息队列可以用于客户机/服务器框架的建立。 C++ 编程示例: * 使用 msgget 函数...
"生产者消费者试验.pdf" ...8. ftok 函数:生成新的 IPC 关键字值。 9. semget 函数:建立新的信号量对象或获取已有对象的标识符。 10. PV 操作:使用信号量机制模拟实现PV 操作,从而控制多个进程对共享资源的使用。
3.2 key_t键和ftok函数 20 3.3 ipc_perm结构 22 3.4 创建与打开IPC通道 22 3.5 IPC权限 24 3.6 标识符重用 25 3.7 ipcs和ipcrm程序 27 3.8 内核限制 27 3.9 小结 28 习题 29 第二部分 消息传递 ...
3.2 key_t键和ftok函数 20 3.3 ipc_perm结构 22 3.4 创建与打开IPC通道 22 3.5 IPC权限 24 3.6 标识符重用 25 3.7 ipcs和ipcrm程序 27 3.8 内核限制 27 3.9 小结 28 习题 29 第二部分 消息传递 31 第4章 ...
3.2 key_t键和ftok函数 20 3.3 ipc_perm结构 22 3.4 创建与打开IPC通道 22 3.5 IPC权限 24 3.6 标识符重用 25 3.7 ipcs和ipcrm程序 27 3.8 内核限制 27 3.9 小结 28 习题 29 第二部分 消息传递 第4章 管道和FIFO 32 ...
键值通常用于标识共享内存段,可以是整数值或者由ftok函数生成的唯一ID。内存大小指定了共享内存的字节数,权限标志类似于文件系统的权限设置,用于控制对共享内存的访问。成功调用`shmget`后,会返回一个共享内存...
3.2 key_t键和ftok函数 20 3.3 ipc_perm结构 22 3.4 创建与打开IPC通道 22 3.5 IPC权限 24 3.6 标识符重用 25 3.7 ipcs和ipcrm程序 27 3.8 内核限制 27 3.9 小结 28 习题 29 第二部分 消息传递 第4章 管道和FIFO 32 ...
键值可以通过 `ftok` 函数生成。该函数接受两个参数:文件名(`fname`)和一个ID(`id`)。键值通常是通过将文件的索引节点号和ID结合得到的。 ```c key_t ftok(const char *fname, int id); ``` **示例**: 假设文件...
- 使用ftok函数生成关键ID,创建共享内存,供应者将生产信息写入共享内存,供其他进程读取。 6. **实验流程**: - 创建并初始化信号量。 - 创建进程,分配角色。 - 供应者根据信号量进行生产与通知,抽烟者根据...
// 使用ftok函数生成键值 int sem_id = semget(key, 1, IPC_CREAT | 0666); if (sem_id == -1) { perror("semget"); return 1; } // 定义信号量操作结构体 struct sembuf op[] = { {0, -1, SEM_UNDO} // ...