process.cpp

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

CPP
588
字号
// $Id: process.cpp 78962 2007-07-20 03:27:14Z sowayaa $// ============================================================================//// = 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"ACE_RCSID(Process, process, "$Id: process.cpp 78962 2007-07-20 03:27:14Z sowayaa $")#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 intparse_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 voidtest_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 voidtest_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 voidtest_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 voidtest_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 voidwin32_test_ls (void){  PROCESS_INFORMATION process_info;  ACE_TEXT_STARTUPINFO startup_info;

⌨️ 快捷键说明

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