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 + -
显示快捷键?