[英]Can't open existing semaphore from another process C++
我正在嘗試從另一個進程中獲取現有的信號量。 要創建信號量,我使用了:
Semaphore(std::string name, int startState) {
name = "Global\\" + name;
Sem = OpenSemaphore(SYNCHRONIZE | SEMAPHORE_MODIFY_STATE, true, (LPCWSTR)name.c_str());
int s = (startState > 0);
if (Sem == NULL) {
Sem = CreateSemaphore(NULL, s, 1, (LPCWSTR)name.c_str());
}
}
在第一個過程中正確創建了信號量。 GetLastError() 返回 0。在第二個過程中,OpenSemaphore 返回 NULL。 GetLastError() 返回 2。我嘗試僅通過“名稱”獲取信號量 - 沒有“全局”,但它得到了相同的結果。 請幫忙)
如果您覺得需要使用 C 風格的轉換(例如(LPCWSTR)name.c_str()
),您應該將其視為您做錯了什么的標志。
就像你在這里做的那樣: std::string
是一個窄字符(即char
)字符串,而你使用寬字符( wchar_t
)函數。 這意味着名稱將不是您所期望的。
如果您繼續使用std::string
您必須使用“ANSI”函數(例如CreateSemaphoreA
)。 否則切換到使用寬字符的std::wstring
。
@SomeProgrammerDude 的回答解釋了您看到的錯誤的原因(字符編碼不匹配)。
我只想指出,在解決了該問題之后,您的代碼中仍然存在競爭條件。
如果你想打開一個現有的信號量(或任何其他類型的命名 kernel 對象),如果它不存在就創建它,那么不要浪費時間打開它,只需無條件地創建它,例如:
Semaphore(std::string name, int startState) {
name = "Global\\" + name;
int s = (startState > 0);
Sem = CreateSemaphoreA(NULL, s, 1, name.c_str());
}
如果 object 已經存在,您將獲得現有 object 的句柄。 否則你會得到一個新的 object 的句柄。 如果需要, GetLastError()
可用於告訴您 object 是否已經存在或重新創建。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.