⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 process.cpp

📁 最新的版本ACE-5.6.8,刚从外文网上搬下,与大家分享.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// $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 + -