2013-01-05 22 views
1

以下程序編譯爲a.exe並作爲「a.exe父項」調用,將打印出「不好」。我如何讓它打印「好?」如何從子程序訪問信號量

編輯:GetLastError返回2

/* Inter-process Communication */ 
#include <windows.h> 
#include <assert.h> 
#include <stdio.h> 

static HANDLE semaphore; 
static STARTUPINFO StartupInfo; 
static PROCESS_INFORMATION ProcessInfo; 
static char *Args = "a.exe child"; 

int createChildProcess() 
{ 
    memset(&StartupInfo, 0, sizeof(StartupInfo)); 
    StartupInfo.cb = sizeof(STARTUPINFO); 
    StartupInfo.dwFlags = STARTF_USESHOWWINDOW; 
    StartupInfo.wShowWindow = SW_HIDE; 

    if (!CreateProcess(NULL, Args, NULL, NULL, FALSE, 
         0, 
         NULL, 
         NULL, 
         &StartupInfo, 
         &ProcessInfo)) 
    { 
     return 0; 
    } 

    return 1; 
} 

int main(int argc, char * argv[]) 
{ 

    if(!strcmp(argv[1], "child")) { 
    semaphore = OpenSemaphore(SYNCHRONIZE|SEMAPHORE_MODIFY_STATE, 
           FALSE, "Global\\EZShare"); 
    if(semaphore==NULL) { 
     printf("bad\n"); 
    } 
    else { 
     printf("good\n"); 
    } 

    } 
    else { 
    semaphore = CreateSemaphore(NULL, 1, 1, "Global\\EZShare"); 
    assert(semaphore!=NULL); 
    assert(createChildProcess()); 
    } 
} 
+0

如何打印出錯? – Mat

+0

GetLastError返回2 –

回答

3

父進程退出早於子進程打開的信號,並且當它發生時,信號被破壞。在父母離開main()之前添加Sleep(10000),您將得到「好」(對於真正的程序,最好等待子進程而不是睡眠)。

+0

另一個選擇是使信號量句柄可繼承(並在調用CreateProcess時設置繼承句柄標誌),以便子進程繼承原始句柄的副本,強制信號量保持打開狀態。當然,在大多數現實世界的情況下,父母最好保持開放,但有邊緣情況。 –

相關問題