ftok file php,Linux和PHP中的ftok函数返回值不一致问题跟踪
在IPC中中,我們經(jīng)常事情ftok函數(shù)來獲取key,來作為獲取消息隊(duì)列id、共享存儲(chǔ)標(biāo)識(shí)和信號(hào)量ID。在項(xiàng)目中使用了php進(jìn)程和linux進(jìn)程通信,采用了消息隊(duì)列的方式,但是結(jié)果表現(xiàn)為php中的ftok和linux中的ftok函數(shù)返回key卻不一樣。如下分析。
實(shí)例
php中運(yùn)行下代碼$intKey?=?ftok("/home/work/orp/msg/tmp",?1);
echo?dechex($intKey)?.?"
";
得到的結(jié)果為311007e1
用c運(yùn)行以下代碼intKey?=?ftok("/home/work/orp/msg/tmp",?1);
printf("%x",?intKey);
得到的結(jié)果為11007e1
顯然得到的結(jié)果不一致,與我們預(yù)期不一樣。為什么會(huì)出現(xiàn)這種情況,下面解答。
源碼分析
1、在php源碼
找到/php/ext/standard/ftok.c文件查看ftok函數(shù)源碼,如下
調(diào)用的c的ftok函數(shù)的第二參數(shù)為 proj[0] 。
2、hhvm中的源碼
文件路徑/php/ext/standard/ftok.c, 查看ftok函數(shù)如下:
調(diào)用的c的ftok函數(shù)的第二參數(shù)為 (int)proj[0] 。
3、demo測(cè)試這種兩種用法#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);
}
運(yùn)行結(jié)果為:
$?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
總結(jié)
1、從demo測(cè)試的來看,源碼中的 (int)proj[0] 和 proj[0] 這兩種寫法得到的是 某個(gè)字符的ASCII碼,所以在php中使用ftok生成的 key 來做為消息隊(duì)列、共享存儲(chǔ)和信號(hào)量與Linux進(jìn)程通信,是有問題的。除非在linux端的程序指定 ftok 的 proj 參數(shù)為 php中對(duì)應(yīng)參數(shù)的ASCII碼值。如將實(shí)例的中C代碼改為:
intKey?=?ftok("/home/work/orp/msg/tmp",?49);
printf("%x",?intKey);
再次運(yùn)行,得到311007e1
與php中一直了,符合要求。
2、這其實(shí)是php中的ftok函數(shù)實(shí)現(xiàn)的問題
總結(jié)
以上是生活随笔為你收集整理的ftok file php,Linux和PHP中的ftok函数返回值不一致问题跟踪的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 基于python的天气预报系统,基于py
- 下一篇: oracle模块损坏,Oracle中模拟
