看這題目就很亂,心情當然也是不怎么美好了。前一段時間做了一個項目,AIX(Unix的一種)中的一個系統向WINDOWS移植,開發環境由IBM的C/C++(叫什么忘記了,好像是xlC)變為VC++。
這是算過來,但是最近進程通信的信號量出了問題(也不算什么問題,就是全局信號量的名字應該怎么命名有點問題了。)
AIX系統中,信號量的名字其實是key_s(本質就是int),key_s是通過ftok返回了。大概的邏輯就是指定一個系統中存在的文件,取文件的索引節點號的低24位,然后高8位使用偏移字段,
這樣,同一個系統文件可以最多生成256個信號量名稱。
但是WINDOWS這邊沒有,WINDOWS這么只需要指定一個字符串就可以了。但是字符串前綴可以是Golbal, Local, 無,三種情況,由于區分信號量是全局,本地,默認(本地)的。
然后我就使用文件名稱(沒有帶路徑)生成了一個信號量的名字,因為當時真的沒有找到WINDOWS的文件索引節點號(壓根沒有這個概念,好吧我承認是被度娘騙的分文不剩)。
后來我領導這日本雅虎上確實找到了WINDOWS這邊與之對應的概念,就是BY_HANDLE_FILE_INFORMATION,其實AIX存文件的時候,是使用設備號+文件號來存儲的,而WINDOWS是
采用設備號+文件號高位+文件號地位來存儲的,應該算的上是一種對應關系。(在WINDOWS這邊也有IPC,但是里面的設備號和文件號都是0)
typedef struct _BY_HANDLE_FILE_INFORMATION {DWORD ???dwFileAttributes;FILETIME ftCreationTime;FILETIME ftLastAccessTime;FILETIME ftLastWriteTime;DWORD ???dwVolumeSerialNumber;DWORD ???nFileSizeHigh;DWORD ???nFileSizeLow;DWORD ???nNumberOfLinks;DWORD ???nFileIndexHigh;DWORD ???nFileIndexLow; } BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION, *LPBY_HANDLE_FILE_INFORMATION;
加粗的就是定義了。使用這個就是可以通過3個DWORD(也可以理解是一種int)就可以唯一標識一個文件了。如果文件不存在,就是-1(在內存中是0xffffffff)。
而后需要解釋的就是WINDOWS中的信號名稱最好是“xxxx-xxxxxxxx-xxxxxxxxxxxxxxxx”(偏移-設備號-文件號)這種形式。
_BY_HANDLE_FILE_INFORMATION 的獲取方式:
---- get fi ----
HANDLE h = INVALID_HANDLE_VALUE;
BY_HANDLE_FILE_INFORMATION fi;
h = CreateFile(path, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
GetFileInformationByHandle(h, &fi);
---- get fi ----