#include <windows.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <process.h>

int main(int argc, char* argv[])
{
  switch (argc)
  {
    case 1:
      {
        STARTUPINFO si;
        PROCESS_INFORMATION pi;

        ZeroMemory( &si, sizeof(si) );
        si.cb = sizeof(si);
        //si.hStdError = si.hStdOutput = si.hStdInput = INVALID_HANDLE_VALUE;
        //si.dwFlags |= STARTF_USESTDHANDLES;

        ZeroMemory( &pi, sizeof(pi) );

        CloseHandle(GetStdHandle(STD_INPUT_HANDLE));
        CloseHandle(GetStdHandle(STD_OUTPUT_HANDLE));
        CloseHandle(GetStdHandle(STD_ERROR_HANDLE));

        CreateProcess(NULL, "a.exe foo bar", NULL, NULL,
            FALSE, 0, NULL, NULL, &si, &pi);
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
      }
      break;
    case 2:
      close(1);
      close(2);
      execl("a.exe", "a.exe", "foo", "bar", NULL);
      break;
    case 3:
      {
        int myfd1, myfd2;
        char buf[256];

        myfd1 = open("_1_", O_CREAT | O_TRUNC | O_WRONLY);
        myfd2 = open("_2_", O_CREAT | O_TRUNC | O_WRONLY);
        write(myfd1, "FD1\n", strlen("FD1\n"));
        write(myfd2, "FD2\n", strlen("FD2\n"));
        printf("--> %d %d <--\n", myfd1, myfd2);
        fprintf(stderr, "==> %d %d <==\n", myfd1, myfd2);
        sprintf(buf, ">>> %d %d <<<\n", myfd1, myfd2);
        write(myfd1, buf, strlen(buf));
        write(myfd2, buf, strlen(buf));
      }
      break;
  }
  return 0;
}



