1

次のプログラムは、a.exeとしてコンパイルされ、「a.exe親」として呼び出され、「bad」を出力します。「良い」と印刷するにはどうすればよいですか?

編集: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());
  }
}
4

1 に答える 1

3

親プロセスは、子プロセスがセマフォを開く前に終了し、それが発生すると、セマフォは破棄されます。Sleep(10000)親で終了する前に追加するmain()と、「良好」になります(実際のプログラムでは、スリープするよりも子プロセスを待つ方がよい)。

于 2013-01-05T17:06:26.810 に答える