📄 process.cpp
字号:
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 void
win32_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_Utils::truncate_cast<int> (
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")));
}
}
#endif
static void
test_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 void
tokenize (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")));
}
}
int
ACE_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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -