ftok("/", 1);是啥意思
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ftok("/", 1);是啥意思相关的知识,希望对你有一定的参考价值。
key = ftok(".", 1); 这样就是将fname设为 当前目录。id是子序号。虽然是int类型,但是只使用8bits(1-255)。
在一般的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 );[/code]
同一段程序,用于保证两个不同用户下的两组相同程序获得互不干扰的IPC键值。
由于etc/ config.ini(假定)为应用系统的关键配置文件,因此不存在被轻易 删除的问题——即使被删,也会很快被发现并重建(此时应用系统也将被重启)。
ftok()的设计目的也在于此。 参考技术A 函数key(lkey1=ftok("/etc/profile",1)里的第二个参数项目ID具体是指...大概意思是根据前面字符串和后面的字节固定那么返回结果就固定,任何一个值不... 参考技术B ftok函数 主要用来产生 key, 通过key,可以确定唯一的进程间通信的消息队列;
他的第一个参数 表述文件路径名“/” 代表根目录, 第二个参数1是个整形变量,比较随意,决定key(32bit)的31~24位的值 参考技术C 啥意思都没用!
如何取回现有的 msg queue id
【中文标题】如何取回现有的 msg queue id【英文标题】:how to get back existing msg queue id 【发布时间】:2012-04-05 07:19:14 【问题描述】:我正在使用 msgget() 系统调用来获取新的 msg 队列。我在其中使用了 IPC_CREAT 和 IPC_EXCL 标志。像
message_queue = msgget(ftok("/tmp", 100), (0666 | IPC_CREAT | IPC_EXCL));
现在,当我的 prog 意外存在时,味精队列仍然存在,我无法重新创建味精队列。所以,我的问题是“我怎样才能取回现有的 msg 队列的 ID?”
顺便问一下,msg queue 的 id 存放在哪里?
【问题讨论】:
【参考方案1】:Regd "我怎样才能取回现有的 msg 队列的 ID?"
来自 man msgget
If msgflg specifies both IPC_CREAT and IPC_EXCL and a message queue already exists for key, then msgget() fails with errno set to EEX-
IST. (This is analogous to the effect of the combination O_CREAT | O_EXCL for open(2).)
尝试不带 IPC_EXCL 标志。
注册。 msg queue在哪里存储它的id
来自人的过程
/proc/sysvipc
Subdirectory containing the pseudo-files msg, sem and shm. These files list the System V Interprocess Communication (IPC)
objects (respectively: message queues, semaphores, and shared memory) that currently exist on the system, providing similar
information to that available via ipcs(1). These files have headers and are formatted (one IPC object per line) for easy under-
standing. svipc(7) provides further background on the information shown by these files.
【讨论】:
感谢回复 user967552。这很有帮助。【参考方案2】:以下是尝试回答问题,如果有用,请转至The Linux Programmer’s Guide。如果它被确定为无关紧要或什么的,那么错误都是我的。
ipcs 命令可用于获取所有 System V IPC 对象的状态。
ipcs -q: Show only message queues
ipcs -s: Show only semaphores
ipcs -m: Show only shared memory
ipcs --help: Additional arguments
ipcrm 命令可用于从内核中删除 IPC 对象。而IPC 对象可以通过用户代码中的系统调用来删除(我们稍后会看到),需要 经常会出现手动删除 IPC 对象的情况,尤其是在开发环境中。
它的用法很简单:
ipcrm <msg | sem | shm> <IPC ID>
【讨论】:
【参考方案3】:不要第二次尝试重新创建消息队列。您第二次使用IPC_CREAT | IPC_EXCL
导致msgget
失败。
来自msgget的手册页
如果 msgflg 同时指定 IPC_CREAT 和 IPC_EXCL 以及消息队列 密钥已存在,则 msgget() 失败,errno 设置为 EEXIST。 (这类似于组合 O_CREAT | O_EXCL 的效果 打开(2)。)
所以您仍然可以第二次继续使用msgget
,但只能使用IPC_CREAT
标志。
还要注意检查ftok
和msgget
的返回值,并将错误值(如果有)与手册页进行比较。还要检查errno
。
此外,如果您对现有消息队列有太多问题,您可以通过调用 msgctl
和 IPC_RMID
标志来删除它
另外,关于 msg 队列存储位置的另一个答案。你可能想删除一个麻烦的消息队列 :) 但请注意,它们是位于虚拟文件系统 /proc 上的只读文件!
【讨论】:
@JohnG 很高兴它帮助了你,约翰! :)以上是关于ftok("/", 1);是啥意思的主要内容,如果未能解决你的问题,请参考以下文章
如何在记事本中批量替换掉相同格式的文本?例如<" seq="1" /> ,<" seq="2" />
json格式数据 "Time":"\/Date(1341417600000+0800)\/" 时间转换
$("#head").load("../common/header.html"); 相对地址文件加载不出来求原因
lua模式匹配 字符串"afa/asdfa/adf/asdfa.asd",截取出最后一个/和.之间的字符
Java字符串 模糊替换如:src="cc/ss.jpg"或src=“cc/sasw.jpg”或还有很多,要全部替换成src="11/1.jpg&