risc-v中文社区

 找回密码
 立即注册
查看: 1241|回复: 0

进程间通信--共享内存之ftok函数

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2022-9-12 17:25:10 | 显示全部楼层 |阅读模式
共享内存是最快速的进程间通信方式,简而言之,ftok获得key,用这个key用shmget创建或获取已经存在的共享内存id,再通过将内存与这个共享内存id用shmat绑定在一起获得一个指针(当然,我们可以将它强转为我们需要的对应的数据结构指针)。
说起来很容易理解,我以前没有用ftok函数,但以前用共享内存都没发现什么问题,但这次用了ftok之后就出了问题。
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
在我的代码中pathname固定设置为".\",可惜,就是这个".\"造成了问题。
1)ftok根据路径名,提取文件信息,再根据这些文件信息及project ID合成key,该路径可以随便设置。
2)该路径是必须存在的,ftok只是根据文件inode在系统内的唯一性来取一个数值,和文件的权限无关。
3)proj_id是可以根据自己的约定,随意设置。这个数字,有的称之为project ID; 在UNIX系统上,它的取值是1到255;
在访问同一共享内存的多个进程先后调用ftok()时间段中,如果fname指向的文件或者目录被删除而且又重新创建,那么文件系统会赋予这个同名文件新的i节点信息,于是这些进程调用的ftok()都能正常返回,但键值key却不一定相同了。由此可能造成的后果是,原本这些进程意图访问一个相同的共享内存对象,然而由于它们各自得到的键值不同,实际上进程指向的共享内存不再一致;如果这些共享内存都得到创建,则在整个应用运行的过程中表面上不会报出任何错误,然而通过一个共享内存对象进行数据传输的目 的将无法实现。


所以要确保key值不变,要么确保ftok()的文件不被删除,要么不用ftok(),指定一个固定的key值

找到问题之所在,当然很容易就解决了。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-4-26 12:40 , Processed in 0.023569 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表