好好爱自己!

【转】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为什么将第二个参数改成字符串型,实在是多此一举,而且毫无意义。

posted @   立志做一个好的程序员  阅读(263)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2018-05-17 【转】Linux 中清空或删除大文件内容的五种方法(truncate 命令清空文件)

不断学习创作,与自己快乐相处

点击右上角即可分享
微信分享提示