日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/3/21 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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函数返回值不一致问题跟踪的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。