【转】php ftok 使用
原文:https://www.myvoipapp.com/blogs/yxh/2015/03/08/php%E5%9D%91%EF%BC%9Aftok/
------------------
最近有个小需求,需要php程序和服务器程序之间进行一些简单通信。调研了几个进程间通信的技术,选择了消息队列方式。
消息队列技术本身不复杂,无非就是生成一个ID,然后使用该ID发送消息或者接受消息。在C程序中,使用ftok来生成ID,而php同样提供了相同名字的函数。因此,在php代码中,想当然地写下了类似语句:
$key_t = msg_get_queue(ftok("/home", 2));
让人惊讶的是,C程序始终接受不到php发送的消息。百思不解之下,使用命令查看系统的消息队列情况:
ipcs -q
结果表明php程序的确在发送消息,只是php的消息队列ID与C程序的消息队列ID居然是不一致的。重新翻看了php的手册,对ftok函数是这么描述的:
int ftok ( string $pathname , string $proj )
值得注意的是:第二个参数居然是字符串型。而在C函数中,该参数定义为int型:
key_t ftok(const char *pathname, int proj_id);
因此,在php代码中,当我们传递整数2给函数ftok时,php转换成了字符‘2’,也就是说,上述示例的php代码实际相当于以下语句:
$key_t = msg_get_queue(ftok("/home", '2'));
导致最终的计算结果与C函数不一致。修改方式也简单,在C程序中,将第二个参数修改为0x32,与php一致即可。
无法理解php为什么将第二个参数改成字符串型,实在是多此一举,而且毫无意义。
标签:
php
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2018-05-17 【转】Linux 中清空或删除大文件内容的五种方法(truncate 命令清空文件)