#include #include #include #include int main (int argc, char **argv) { HANDLE event0, event1; int child_pid; char *buf0, *buf1, *tmp; DWORD dwresult; if (argc != 2) return 1; if (strcmp (argv[1], "child") == 0) { printf ("SLAVE: i am %d\n", getpid()); buf0 = getenv ("SECRETHANDLEVALUE0"); buf1 = getenv ("SECRETHANDLEVALUE1"); printf ("SLAVE: Got events %s and %s\n", buf0, buf1); event0 = event1 = NULL; if (strlen (buf0) > 0) event0 = (HANDLE) strtol (buf0, &tmp, 16); if (strlen (buf1) > 0) event1 = (HANDLE) strtol (buf1, &tmp, 16); if (event0 != NULL) { SetLastError (0); BOOL bresult = SetEvent (event0); printf ("SLAVE: SetEvent for %08X returned %d, GLE is %d\n", event0, bresult, GetLastError ()); } else printf ("SLAVE: event0 is NULL!\n"); if (event1 != NULL) { SetLastError (0); dwresult = WaitForSingleObject (event1, INFINITE); printf ("SLAVE: Wait for %08X returned %d, GLE is %d\n", event1, dwresult, GetLastError ()); } else printf ("SLAVE: event1 is NULL!\n"); _getch(); return 0; } else if (strcmp (argv[1], "grandchild") == 0) { printf ("INTERMEDIATE SLAVE: i am %d\n", getpid()); SetLastError (0); child_pid = _spawnl (_P_NOWAIT, "handlepasstest_slave.exe", "handlepasstest_slave.exe", "child", NULL); printf ("INTERMEDIATE SLAVE: spawned a child (handle=%d), GLE is %d\n", child_pid, GetLastError ()); _getch(); return 0; } _getch(); return 1; }