process.cpp

来自「ace开发环境 用来开发网络程序 其运用了设计模式、多平台、C++等多种知识」· C++ 代码 · 共 588 行 · 第 1/2 页

CPP
588
字号
  ACE_OS::memset ((void *) &startup_info,                  0,                  sizeof startup_info);  ACE_OS::memset ((void *) &process_info,                  0,                  sizeof process_info);  startup_info.cb = sizeof startup_info;  startup_info.dwFlags = STARTF_USESTDHANDLES;  ACE_HANDLE std_out = ACE_STDOUT;  if (!::DuplicateHandle (::GetCurrentProcess (),                          std_out,                          ::GetCurrentProcess (),                          &startup_info.hStdOutput,                          0,                          TRUE,                          DUPLICATE_SAME_ACCESS))    {      ACE_ERROR ((LM_ERROR,                  ACE_TEXT ("%p duplicate failed.\n"),                  ACE_TEXT ("test_ls")));      return;    }  BOOL fork_result =    ACE_TEXT_CreateProcess (ACE_TEXT ("c:\\Utils\\bin\\ls.exe"),                            ACE_TEXT ("-a"),                            0, // No process attributes.                            0, // No thread attributes.                            TRUE, // Allow handle inheritance.                            0, // CREATE_NEW_CONSOLE, // Create a new console window.                            0,                            0, // Current directory to start in.                            &startup_info,                            &process_info);  ::CloseHandle (startup_info.hStdOutput);  if (fork_result == 0)    ACE_ERROR ((LM_ERROR,                ACE_TEXT ("%p CreateProcess failed.\n"),                ACE_TEXT ("test_ls")));  else    {      ::WaitForSingleObject (process_info.hProcess,                             INFINITE);      ACE_DEBUG ((LM_ERROR, ACE_TEXT ("ls succeeded.\n")));    }}// This code spawns a new process.  The new process inherits our// existing environment, plus one more.  This has to be done by hand// since CreateProcess does not allow us to inherit AND add// environment variables.static voidwin32_spawn_environment_process (void){  PROCESS_INFORMATION process_info;  ACE_TEXT_STARTUPINFO startup_info;  ACE_OS::memset ((void *) &startup_info,                  0,                  sizeof startup_info);  ACE_OS::memset ((void *) &process_info,                  0,                  sizeof process_info);  startup_info.cb = sizeof (startup_info);  startup_info.dwFlags = STARTF_USESTDHANDLES;  ACE_HANDLE std_in = ACE_STDIN;  ACE_HANDLE std_out = ACE_STDOUT;  ACE_HANDLE std_err = ACE_STDERR;  if (!::DuplicateHandle (::GetCurrentProcess(),                          std_out,                          ::GetCurrentProcess(),                          &startup_info.hStdOutput,                          0,                          TRUE,                          DUPLICATE_SAME_ACCESS))    {      ACE_ERROR ((LM_ERROR,                  ACE_TEXT ("%p duplicate failed.\n"),                  ACE_TEXT ("spawn_environment_process")));      return;    }  if (!::DuplicateHandle (::GetCurrentProcess(),                          std_err,                          ::GetCurrentProcess(),                          &startup_info.hStdError,                          0,                          TRUE,                          DUPLICATE_SAME_ACCESS))    {      ACE_ERROR ((LM_ERROR,                  ACE_TEXT ("%p duplicate failed.\n"),                  ACE_TEXT ("spawn_environment_process")));      return;    }  if (!::DuplicateHandle (::GetCurrentProcess(),                          std_in,                          ::GetCurrentProcess(),                          &startup_info.hStdInput,                          0,                          TRUE,                          DUPLICATE_SAME_ACCESS))    {      ACE_ERROR ((LM_ERROR,                  ACE_TEXT ("%p duplicate failed.\n"),                  ACE_TEXT ("spawn_environment_process")));      return;    }  // Normally, this would be just GetEnvironmentStrings, but it  // doesn't follow the same rules as the rest of the Win32 API  ACE_TCHAR *existing_environment = ACE_OS::getenvstrings ();  ACE_TCHAR environment[10240];  ACE_OS::sprintf (environment,                   ACE_TEXT("ACE_PROCESS_TEST=%s"),                   environment_string);  int size = 0;  while (existing_environment[size] != '\0')    size += ACE_OS::strlen (existing_environment + size) + 1;  ACE_OS::memcpy (environment + (ACE_OS::strlen (environment) + 1),                  existing_environment,                  size);  ACE_TEXT_FreeEnvironmentStrings (existing_environment);  BOOL fork_result =    ACE_TEXT_CreateProcess (ACE_TEXT ("d:\\harrison\\ACE_wrappers\\examples\\OS\\Process\\process.exe"),                            ACE_TEXT ("process -g"),                            0, // No process attributes.                            0, // No thread attributes.                            TRUE, // Allow handle inheritance.                            0, // CREATE_NEW_CONSOLE, // Create a new console window.                            environment, // Environment.                            //"d:\\harrison\\ACE_wrappers\\examples\\OS\\Process\\",                            0,                            &startup_info,                            &process_info);  ::CloseHandle (startup_info.hStdOutput);  ::CloseHandle (startup_info.hStdError);  if (fork_result == 0)    ACE_ERROR ((LM_ERROR,                ACE_TEXT ("%p.\n"),                ACE_TEXT ("spawn_environment_process")));  else    {      ::WaitForSingleObject (process_info.hProcess,                             INFINITE);      ACE_DEBUG ((LM_ERROR,                  ACE_TEXT ("spawn_environment_process succeeded.\n")));    }}#endifstatic voidtest_setenv (const ACE_TCHAR *argv0){  ACE_Process_Options options;  //  options.setenv ("ACE_PROCESS_TEST", "here's a really large number: %u", 0 - 1);  options.setenv (ACE_TEXT ("ACE_PROCESS_TEST= here's a large number %u"),                  0 - 1);  options.setenv (ACE_TEXT ("ACE_PROCESS_TEST2"), ACE_TEXT ("ophilli"));#if defined (ACE_WIN32) || !defined (ACE_USES_WCHAR)  options.command_line ("%s -g", argv0);#else  options.command_line ("%ls -g", argv0);#endif  ACE_Process process;  if (process.spawn (options) == -1)    {      ACE_ERROR ((LM_ERROR,                  ACE_TEXT ("%p.\n"),                  ACE_TEXT ("test_setenv")));      return;    }  ACE_exitcode status;  process.wait (&status);  ACE_DEBUG ((LM_DEBUG,              ACE_TEXT ("Process exit with status %d\n"),              status));}// Tests the ACE_Tokenizer.static voidtokenize (ACE_TCHAR *buffer){  // This tokenizer will replace all spaces with end-of-string  // characters and will preserve text between "" and '' pairs.  ACE_Tokenizer parser (buffer);  parser.delimiter_replace (' ', '\0');  parser.preserve_designators ('\"', '\"'); // "  This quote is for emacs  parser.preserve_designators ('\'', '\'');  for (const ACE_TCHAR *temp; ;)    {      temp = parser.next ();      if (temp == 0)        break;      ACE_DEBUG ((LM_DEBUG, temp));      ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\n")));    }}intACE_TMAIN (int argc, ACE_TCHAR *argv[]){  if (ACE_LOG_MSG->open (argv[0]) == -1)    ACE_ERROR ((LM_ERROR,                ACE_TEXT ("cannot open logger!!!\n")));  ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("starting...\n")));  if (::parse_args (argc, argv) == -1)    return -1;  if (run_all)    {#if defined (ACE_WIN32) || !defined (ACE_USES_WCHAR)      const ACE_TCHAR *cmdline = ACE_TEXT ("%s -d -l -s -w");#else      const ACE_TCHAR *cmdline = ACE_TEXT ("%ls -d -l -s -w");#endif      ACE_Process_Options options;      options.command_line (cmdline, argv[0]);      ACE_Process process;      if (process.spawn (options) == -1)        ACE_ERROR_RETURN ((LM_ERROR,                           ACE_TEXT ("%p.\n"),                           ACE_TEXT ("main")),                          -1);      ACE_exitcode status;      process.wait (&status);      ACE_DEBUG ((LM_DEBUG,                  ACE_TEXT ("Process exit with status %d\n"),                  status));    }  if (run_date)    ::test_date ();  if (run_setenv)    ::test_setenv (argv[0]);  if (get_env)    {      ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("checking ACE_PROCESS_TEST\n")));      char *value = ACE_OS::getenv ("ACE_PROCESS_TEST");      char *value2 = ACE_OS::getenv ("ACE_PROCESS_TEST2");      ACE_DEBUG ((LM_DEBUG,                  "ACE_PROCESS_TEST = %C.\n"                  "ACE_PROCESS_TEST2 = %C.\n",                  value == 0 ? "no value" : value,                  value2 == 0 ? "no value" : value2));    }  if (run_ls)    ::test_ls ();  if (run_wait)    ::test_wait ();#if defined (ACE_WIN32)  if (environment_string != 0)    win32_spawn_environment_process ();#endif /* ACE_WIN32 */  if (print_file != 0)    test_more ();  ACE_TCHAR buf1[30];  ACE_TCHAR buf2[30];  ACE_OS::strcpy(buf1, ACE_TEXT (" -f hi honey -g \"I\'m home\""));  ACE_OS::strcpy(buf2, ACE_TEXT ("\"token 1\"\'token 2\'\"token 3\" "));  if (run_tokenizer)    {      tokenize (buf1);      tokenize (buf2);    }  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?