ftok file php,Linux和PHP中的ftok函数返回值不一致问题跟踪
在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函数返回值不一致问题跟踪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于python的天气预报系统,基于py
- 下一篇: oracle模块损坏,Oracle中模拟