📄 process.cpp
字号:
// $Id: process.cpp 82610 2008-08-12 19:46:36Z parsons $
// ============================================================================
//
// = LIBRARY
// examples
//
// = FILENAME
// process.cpp
//
// = DESCRIPTION
// This example tests the <ACE_Process>. For more info, check the
// README file in this directory.
//
// = AUTHOR
// Tim Harrison <harrison@cs.wustl.edu>.
//
// ============================================================================
#include "ace/OS_NS_errno.h"
#include "ace/OS_NS_fcntl.h"
#include "ace/OS_NS_stdlib.h"
#include "ace/OS_NS_stdio.h"
#include "ace/OS_NS_string.h"
#include "ace/OS_NS_unistd.h"
#include "ace/Get_Opt.h"
#include "ace/Process.h"
#include "ace/Log_Msg.h"
#include "ace/Time_Value.h"
#include "ace/SString.h"
#include "ace/Truncate.h"
ACE_RCSID(Process, process, "$Id: process.cpp 82610 2008-08-12 19:46:36Z parsons $")
#if defined (ACE_WIN32)
#define EXEC_NAME ACE_TEXT ("MORE.COM")
const ACE_TCHAR *DATE_PATH = ACE_TEXT ("date.exe");
const ACE_TCHAR *LS_PATH = ACE_TEXT ("ls.exe");
const ACE_TCHAR *SLEEP_PATH = ACE_TEXT ("sleep.exe");
#else
#define EXEC_NAME ACE_TEXT ("less")
const ACE_TCHAR *DATE_PATH = ACE_TEXT ("date");
const ACE_TCHAR *LS_PATH = ACE_TEXT ("ls");
const ACE_TCHAR *SLEEP_PATH = ACE_TEXT ("sleep");
#endif /* ACE_WIN32 */
static const ACE_TCHAR *executable = EXEC_NAME;
static ACE_TCHAR *print_file = 0;
static ACE_TCHAR *environment_string = 0;
static int get_env = 0;
static int run_date = 0;
static int run_ls = 0;
static int run_all = 0;
static int run_setenv = 0;
static int run_tokenizer = 0;
static int run_wait = 0;
// Parse the command-line arguments and set options.
static int
parse_args (int argc, ACE_TCHAR **argv)
{
ACE_Get_Opt get_opt (argc, argv, ACE_TEXT ("dlx:p:e:gastuw"));
int c;
while ((c = get_opt ()) != -1)
{
switch (c)
{
case 't':
run_tokenizer = 1;
break;
case 's':
run_setenv = 1;
break;
case 'a':
run_all = 1;
break;
case 'd':
run_date = 1;
break;
case 'l':
run_ls = 1;
break;
case 'x':
executable = get_opt.opt_arg ();
break;
case 'p':
print_file = get_opt.opt_arg ();
break;
case 'e':
environment_string = get_opt.opt_arg ();
break;
case 'g':
get_env = 1;
break;
case 'w':
run_wait = 1;
break;
case 'u':
default:
ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("Usage:\n")
ACE_TEXT ("-d print date\n")
ACE_TEXT ("-l run ls\n")
ACE_TEXT ("-x <executable=more.com>\n")
ACE_TEXT ("-p print <file_name>\n")
ACE_TEXT ("-e <env variable message>\n")
ACE_TEXT ("-s setenv ACE_PROCESS_ENV and spawn -g\n")
ACE_TEXT ("-g get_env ACE_PROCESS_ENV\n")
ACE_TEXT ("-t test tokenizer\n")
ACE_TEXT ("-w test wait functions\n")
ACE_TEXT ("-a run all (d,l,e \"running\")\n")),
-1);
}
}
return 0;
}
// This shows how to set handles.
static void
test_more (void)
{
ACE_HANDLE infile = ACE_OS::open (print_file, O_RDONLY);
if (infile == ACE_INVALID_HANDLE)
{
ACE_ERROR ((LM_DEBUG, ACE_TEXT ("%p\n"), print_file));
return;
}
ACE_Process new_process;
ACE_Process_Options options;
options.command_line (executable);
options.set_handles (infile);
if (new_process.spawn (options) == -1)
{
int error = ACE_OS::last_error ();
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p errno = %d.\n"),
ACE_TEXT ("test_more"),
error));
}
ACE_exitcode status;
new_process.wait (&status);
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("Process exit with status %d\n"),
status));
ACE_OS::close (infile);
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("More succeeded.\n")));
}
// This is a simple usage of ACE_Process.
static void
test_date (void)
{
ACE_Process_Options options;
options.command_line (DATE_PATH);
// Try to create a new process running date.
ACE_Process new_process;
if (new_process.spawn (options) == -1)
{
int error = ACE_OS::last_error ();
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p errno = %d.\n"),
ACE_TEXT ("test_date"),
error));
return;
}
ACE_exitcode status;
new_process.wait (&status);
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("Process exit with status %d\n"),
status));
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("date succeeded.\n")));
}
static void
test_ls (void)
{
ACE_Process_Options options;
#if defined (ACE_WIN32) || !defined (ACE_USES_WCHAR)
options.command_line (ACE_TEXT ("%s -al"), LS_PATH);
#else
options.command_line (ACE_TEXT ("%ls -al"), LS_PATH);
#endif
ACE_Process new_process;
if (new_process.spawn (options) == -1)
{
int error = ACE_OS::last_error ();
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p errno = %d.\n"),
ACE_TEXT ("test_ls"),
error));
}
ACE_exitcode status;
new_process.wait (&status);
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("Process exit with status %d\n"),
status));
}
static void
test_wait (void)
{
ACE_Process_Options options;
#if defined (ACE_WIN32) || !defined (ACE_USES_WCHAR)
options.command_line (ACE_TEXT ("%s 10"), SLEEP_PATH);
#else
options.command_line (ACE_TEXT ("%ls 10"), SLEEP_PATH);
#endif
ACE_Process process1;
if (process1.spawn (options) == -1)
{
int error = ACE_OS::last_error ();
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p errno = %d.\n"),
ACE_TEXT ("test_ls"),
error));
}
int result;
ACE_exitcode status;
//FUZZ: disable check_for_lack_ACE_OS
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("[%T] New process sleeping 10; try wait(2)\n")));
//FUZZ: enable check_for_lack_ACE_OS
result = process1.wait (ACE_Time_Value (2), &status);
//FUZZ: disable check_for_lack_ACE_OS
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("[%T] wait(2) returns %d(%d)...now try regular wait\n"),
result,
status));
//FUZZ: enable check_for_lack_ACE_OS
result = process1.wait (&status);
//FUZZ: disable check_for_lack_ACE_OS
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("[%T] wait() returns %d(%d)\n"),
result,
status));
//FUZZ: enable check_for_lack_ACE_OS
ACE_Process process2;
if (process2.spawn (options) == -1)
{
int error = ACE_OS::last_error ();
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("%p errno = %d.\n"),
ACE_TEXT ("test_ls"),
error));
}
//FUZZ: disable check_for_lack_ACE_OS
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("[%T] New process sleeping 10; try wait(12)\n"),
status));
//FUZZ: enable check_for_lack_ACE_OS
result = process2.wait (ACE_Time_Value (12), &status);
//FUZZ: disable check_for_lack_ACE_OS
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("[%T] wait(12) returns %d(%d)...now try regular wait\n"),
result,
status));
//FUZZ: enable check_for_lack_ACE_OS
result = process2.wait (&status);
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT ("[%T] wait returns %d(%d)\n"),
result,
status));
}
#if defined (ACE_WIN32)
// This is just to test the direct usage of CreateProcess. I use this
// occasionally as a sanity check when ACE_Process breaks.
static void
win32_test_ls (void)
{
PROCESS_INFORMATION process_info;
ACE_TEXT_STARTUPINFO startup_info;
ACE_OS::memset ((void *) &startup_info,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -