文档章节

window linux IPC ftok BY_HANDLE_FILE_INFORMATION

Y
 Y13
发布于 2016/05/14 01:39
字数 589
阅读 7
收藏 0

看这题目就很乱,心情当然也是不怎么美好了。前一段时间做了一个项目,AIX(Unix的一种)中的一个系统向WINDOWS移植,开发环境由IBM的C/C++(叫什么忘记了,好像是xlC)变为VC++。

这是算过来,但是最近进程通信的信号量出了问题(也不算什么问题,就是全局信号量的名字应该怎么命名有点问题了。)

AIX系统中,信号量的名字其实是key_s(本质就是int),key_s是通过ftok返回了。大概的逻辑就是指定一个系统中存在的文件,取文件的索引节点号的低24位,然后高8位使用偏移字段,

这样,同一个系统文件可以最多生成256个信号量名称。

但是WINDOWS这边没有,WINDOWS这么只需要指定一个字符串就可以了。但是字符串前缀可以是Golbal, Local, 无,三种情况,由于区分信号量是全局,本地,默认(本地)的。

然后我就使用文件名称(没有带路径)生成了一个信号量的名字,因为当时真的没有找到WINDOWS的文件索引节点号(压根没有这个概念,好吧我承认是被度娘骗的分文不剩)。

后来我领导这日本雅虎上确实找到了WINDOWS这边与之对应的概念,就是BY_HANDLE_FILE_INFORMATION,其实AIX存文件的时候,是使用设备号+文件号来存储的,而WINDOWS是

采用设备号+文件号高位+文件号地位来存储的,应该算的上是一种对应关系。(在WINDOWS这边也有IPC,但是里面的设备号和文件号都是0)

typedef struct _BY_HANDLE_FILE_INFORMATION {
  DWORD    dwFileAttributes;
  FILETIME ftCreationTime;
  FILETIME ftLastAccessTime;
  FILETIME ftLastWriteTime;
  DWORD    dwVolumeSerialNumber;
  DWORD    nFileSizeHigh;
  DWORD    nFileSizeLow;
  DWORD    nNumberOfLinks;
  DWORD    nFileIndexHigh;
  DWORD    nFileIndexLow;
} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION, *LPBY_HANDLE_FILE_INFORMATION;

加粗的就是定义了。使用这个就是可以通过3个DWORD(也可以理解是一种int)就可以唯一标识一个文件了。如果文件不存在,就是-1(在内存中是0xffffffff)。
而后需要解释的就是WINDOWS中的信号名称最好是“xxxx-xxxxxxxx-xxxxxxxxxxxxxxxx”(偏移-设备号-文件号)这种形式。
_BY_HANDLE_FILE_INFORMATION 的获取方式:
---- get fi ----
HANDLE h = INVALID_HANDLE_VALUE;
BY_HANDLE_FILE_INFORMATION fi;
h = CreateFile(path, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
GetFileInformationByHandle(h, &fi);
---- get fi ----

© 著作权归作者所有

共有 人打赏支持
Y

Y13

粉丝 0
博文 30
码字总数 148304
作品 0
大连
高级程序员
【IPC通信】key_t键和ftok函数

System V IPC分为三种: System V消息队列 System V信号量 System V共享内存区 这三种类型的IPC使用keyt值做为它们的名字。keyt这个数据类型在<sys/types.h>有定义,通常是一个至少32位的整数...

恋恋美食
2011/11/11
0
0
linux ftok()函数 --多进程IPC之共享内存

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

李东委
2014/11/29
0
0
unix/linux共享内存应用

共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区。在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一 个共享内存区的最大字节数shmmax,系统范围内最大共享内存区...

barsoom
2013/06/09
0
0
linux环境编程-- ftok()函数

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

晨曦之光
2012/03/09
225
0
进程间通信学习小结(共享内存)

要使用共享内存,应该有如下步骤: 1.开辟一块共享内存 shmget() 2.允许本进程使用共某块共享内存 shmat() 3.写入/读出 4.禁止本进程使用这块共享内存 shmdt() 5.删除这块共享内存 shmctl()...

晨曦之光
2012/03/09
2.4K
0

没有更多内容

加载失败,请刷新页面

加载更多

一个可能的NEO链上安全随机数解决方案

0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执...

暖冰
今天
1
0
【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
4
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
17
2

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部