在IPC中中,我们经常事情ftok函数来获取key,来作为获取消息队列id、共享存储标识和信号量ID。在项目中使用了php进程和linux进程通信,采用了消息队列的方式,但是结果表现为php中的ftok和linux中的ftok函数返回key却不一样。如下分析。

实例

php中运行下代码$intKey = ftok("/home/work/orp/msg/tmp", 1);

echo dechex($intKey) . "

";

得到的结果为311007e1

用c运行以下代码intKey = ftok("/home/work/orp/msg/tmp", 1);

printf("%x", intKey);

得到的结果为11007e1

显然得到的结果不一致,与我们预期不一样。为什么会出现这种情况,下面解答。

源码分析

1、在php源码

找到/php/ext/standard/ftok.c文件查看ftok函数源码,如下

调用的c的ftok函数的第二参数为 proj[0] 。

2、hhvm中的源码

文件路径/php/ext/standard/ftok.c, 查看ftok函数如下:

调用的c的ftok函数的第二参数为 (int)proj[0] 。

3、demo测试这种两种用法#include

#include

#include

int main(int argc, char const *argv[])

{

char proj[1];

strcpy(proj, argv[1]);

printf("key1 %d

", (int)proj[0]);

printf("key2 %d

", proj[0]);

printf("key3 %s

", proj);

}

运行结果为:

$ a.out 1

key1 49

key2 49

key3 1

$ a.out a

key1 97

key2 97

key3 a

翻阅ASCII码表可知

1 的ASCII码为 49

a 的ASCII码为 97

总结

1、从demo测试的来看,源码中的 (int)proj[0] 和 proj[0] 这两种写法得到的是 某个字符的ASCII码,所以在php中使用ftok生成的 key 来做为消息队列、共享存储和信号量与Linux进程通信,是有问题的。除非在linux端的程序指定 ftok 的 proj 参数为 php中对应参数的ASCII码值。如将实例的中C代码改为:

intKey = ftok("/home/work/orp/msg/tmp", 49);

printf("%x", intKey);

再次运行,得到311007e1

与php中一直了,符合要求。

2、这其实是php中的ftok函数实现的问题

ftok file php,Linux和PHP中的ftok函数返回值不一致问题跟踪相关推荐

  1. python定义函数后怎么输出_python中如何定义函数返回值

    返回值简介: 简单介绍print和return的区别,print仅仅是打印在控制台,而return则是将return后面的部分作为返回值作为函数的输出,可以用变量接走,继续使用该返回值做其它事. 函数 ...

  2. java 函数参数 返回值_java中如何用函数返回值作为post提交的参数?

    1.我想实现的功能是在java程序中导入HttpURLConnection类,然后将函数的值作为post方法要提交的参数,最后显示在显示台上. 2.要用到的函数是自己写的可以显示实时计算机cpu.内存 ...

  3. 在Linux-C中使用read函数返回值为0的问题

    在Ubuntu中时使用read函数读取write函数写入到文件的数据时,发现读取到的内容为空,之后查看read函数的返回值发现也为空 经过思考后发送是在使用write函数之后,文件内部的文件指针指向文 ...

  4. UE C++中获得蓝图函数返回值

    UE 反射应用 方法一: UFunction* bpFunc = ik_actor->GetClass()->FindFunctionByName(FName("GetRetur ...

  5. linux中signal函数返回值,signal函数、sigaction函数及信号集操作函数

    信号是与一定的进程相联系的.也就是说一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如一个进程可以忽略某些信号而只处理其他一些信号另外一个进程还可以选择如何处理信号.总之这些总与特定的进程相联 ...

  6. linux中popen汉字乱码,Python中使用subprocess.Popen返回值乱码解决方案

    Python中使用subprocess.Popen返回值乱码解决方案 问题描述 在python 2.7中,使用subprocess.Popen()调用*nix命令,并通过管道,获取其输出,并将其返回值 ...

  7. python os.system保存返回值_python中os.system的返回值

    python中os.system()的返回值 1.python中的 os.system(cmd)的返回值与linux命令返回值(具体参见本文附加内容)的关系 你们都习惯用os.systemv()函数执 ...

  8. linux如何拿到文件的返回值,linux 下read函数返回值分析

    原文出处:http://blog.chinaunix.net/space.php?uid=20558494&do=blog&id=2803003 read函数是Linux下不带缓存的文 ...

  9. python 函数变量_Python函数中的变量和函数返回值

    1.函数的变量 局部变量和全局变量: Python中的任何变量都有特定的作用域 在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称之为局部变量 在一个文件顶部定义的变 ...

最新文章

  1. 【组队学习】【32期】动手学数据分析
  2. Hbase原理、基本概念、基本架构
  3. keras和tensorflow使用 keras.callbacks.TensorBoard 可视化数据
  4. php中如何写js代码提示_PHP 如何编写类似js中alert() 提示框
  5. 【算法学习笔记】07.数据结构基础 链表 初步练习
  6. mysql 经验_mysql经验
  7. Git 添加和提交组合命令
  8. android gone动画_Android动画之淡入淡出
  9. livechart 只显示 y 值_【科研工具51】谷歌,谷歌学术,Scihub有效网址检索软件——Y学术...
  10. WaitForMultipleObjects函数有效值分析
  11. 企业管理软件 Compiere ERPCRM
  12. CPU启动计算机,如何加快双核CPU计算机win7启动速度
  13. Java compiler level does not match the version of the installed Java project facet.问题
  14. windows下mysql忘记密码重置
  15. 多种方式99.9%解决从PDF复制文字后乱码问题
  16. opencv python 人脸识别 相似度_OpenCV+python 人脸识别
  17. Photoshop调出田园照片唯美手绘油画效果
  18. python截图工具和模拟鼠标键盘_python PyAutoGUI 模拟鼠标键盘操作和截屏功能
  19. 在idea配置虚拟机参数与虚拟机内存溢出
  20. mounted钩子函数_解决Vue中mounted钩子函数获取节点高度出错问题

热门文章

  1. Ubuntu下默认使用dash而非bash
  2. 【LeetCode从零单排】No26.Remove Duplicates from Sorted Array
  3. 漫谈九品中正制和现阶段阶层分层
  4. Java内存模型深度解析:final--转
  5. java中的vo 、dto 、dao--转
  6. Java 动态代理机制分析及扩展--转
  7. 格子大法与换入换出分析
  8. android webservices 返回多行多列数据,Pandas: 如何将一列中的文本拆分为多行?
  9. delphi xe firedac mysql_xe6+firedac 连接sybase
  10. Python数据结构——array