最近有个小需求,需要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为什么将第二个参数改成字符串型,实在是多此一举,而且毫无意义。

ftok函数 php,php坑:ftok相关推荐

  1. key_t键和ftok函数

    目录 `key_t键`.`ftok函数` key_t键.ftok函数 key_t ftok(const char *pathname, int proj_id); 功能:通过ftok返回的是根据文件( ...

  2. linux环境编程-- ftok()函数

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

  3. ftok file php,Linux和PHP中的ftok函数返回值不一致问题跟踪

    在IPC中中,我们经常事情ftok函数来获取key,来作为获取消息队列id.共享存储标识和信号量ID.在项目中使用了php进程和linux进程通信,采用了消息队列的方式,但是结果表现为php中的fto ...

  4. key_t IPC键和ftok函数详解和剖析

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

  5. key_t键和ftok函数(转)

    key_t键 System V IPC使用key_t值作为它们的名字,在Redhat linux(后续验证默认都在该平台下)下key_t被定义为int类型,追溯如下: /usr/include/sys ...

  6. linux ftok函数

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

  7. linux C -- ftok函数

    链接: linux C学习目录 原文链接:https://blog.csdn.net/u013485792/article/details/50764224 关于ftok函数,先不去了解它的作用来先说 ...

  8. ftok函数的作用:

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

  9. 【IPC通信】key_t键和ftok函数

    System V IPC分为三种: System V消息队列 System V信号量 System V共享内存区 这三种类型的IPC使用key_t值做为它们的名字.key_t这个数据类型在<sy ...

最新文章

  1. 01 多线程概念及其实现方式
  2. css如何让图片不平铺,css怎么设置图片平铺方式?
  3. nginx 只允许/不允许 其他域名直接访问
  4. ActiveMQ网络连接
  5. 防止抓取html代码,网页中用html代码注释的内容会被抓取吗
  6. python去掉字符串最外侧的引号_疯狂Python讲义第二章读书笔记
  7. HOWTO:将 IOCTL 发送到筛选器驱动程序
  8. php中ci框架分页,Codeigniter(CI)框架分页函数及相关知识
  9. 传导、辐射和谐波总结,大家共同学习
  10. HTML5快速设计网页
  11. 基因重组-冲刺日志(第八天)
  12. Third season seventeenth episode,Ross and Rachel can not stay at one place???
  13. 中文分词词库汇总(一)
  14. Android性能测试初探,合集粘贴版,转自Testerhome,卡斯著
  15. [Solved] Splunk: Cannot get username when all users are selected“
  16. 体积渲染(3)——3D值噪声+光线步进实现体积云
  17. 3点钟无眠区块链:96小时聊天内容精华全记录
  18. Python3爬取淘宝网商品数据!
  19. Mac如何安装MySQL和Navicat
  20. 微信拼好货商城团购研究转

热门文章

  1. gradle项目:如何使用idea导入一个自定义jar包
  2. 若依RuoYi框架log图标与文字怎么改?
  3. Laya水波shader
  4. 史上最全的Java进阶书籍推荐,你看了几本?
  5. JSP[jsp文件]
  6. SQL之case when then用法
  7. Samsung/三星Galaxy SIII I9300(玛瑙黑) root教程_方法
  8. 基于极光IM,ColorUI,renren java开发框架制作的论坛社群群聊小程序
  9. 中专计算机教研组活动总结,信息技术教研组工作总结【三篇】
  10. 使用计算机也要遵守规范教学反思,珍爱生命遵守规则教学反思