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