Changeset 22183 for main/trunk/greenstone2/runtime-src/src
- Timestamp:
- 2010-05-27T11:32:46+12:00 (14 years ago)
- Location:
- main/trunk/greenstone2/runtime-src/src/recpt
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/greenstone2/runtime-src/src/recpt/os_process.cpp
r22177 r22183 26 26 #include "os_process.h" 27 27 28 osprocess::osprocess(char* cmdline, OSProcessPipeMode mode) 28 osprocess::osprocess(OSProcessPipeMode mode, 29 char* prog_name, char* argv[], char* envp[]) 29 30 : mode_(mode) 30 31 {} … … 54 55 using namespace std; 55 56 57 58 56 59 void test_uni_write_pipe() 57 60 { 58 61 #ifdef __WIN32__ 59 char* prog_name = "c:\\Windows\\system32\\java.exe"; 60 char* cmd_line = "java"; 61 62 //char* input_line = "echo hi there\n"; 63 //char* prog_name = "c:\\cygwin\\bin\\cat.exe"; 64 //char* cmd_line = "cat"; 65 #else 66 char* cmd_line = "/usr/bin/java"; 67 //char* cmd_line = "java"; 68 #endif 69 70 #ifdef __WIN32__ 71 osprocesswindows* process = new osprocesswindows(cmd_line,uniRead); 72 #else 73 osprocessunix* process = new osprocessunix(cmd_line,uniRead); 62 char* prog_name = "type"; 63 char* argv[] = { "type", NULL } ; 64 65 #else 66 char* prog_name = "tr"; 67 char* argv[] = { "tr", "[A-Z]", "[a-z]", NULL }; 68 #endif 69 70 cout << "<hr>" << endl; 71 cout << "<p>Unidirectional Write Test" << endl; 72 cout << "<p> Converts uppercase letters to lowercase" << endl; 73 cout << "<p> These are then sent to whereever the stdout of the child process goes" << endl; 74 cout << "<p>" << endl; 75 76 #ifdef __WIN32__ 77 osprocesswindows* process = new osprocesswindows(uniWrite,prog_name,argv); 78 #else 79 osprocessunix* process = new osprocessunix(uniWrite,prog_name,argv); 80 #endif 81 82 char* buffer = "TESTING uniWirite IN CAP\nTesting uniWrite in Mixed Case\n"; 83 int buffer_len = strlen(buffer); 84 85 if (!process->write(buffer,buffer_len)) { 86 cerr << "Error: failed to write to child process\n"; 87 } 88 89 process->close(); 90 91 process->wait(); 92 93 delete process; 94 } 95 96 97 void test_uni_read_pipe() 98 { 99 char* prog_name = "java"; 100 char* argv[] = { "java", NULL }; 101 102 cout << "<hr>" << endl; 103 cout << "<p>Unidirectional Read Test" << endl; 104 cout << "<p> The output of 'java' is read in by this process and then sent to stdout" << endl; 105 cout << "<p>" << endl; 106 107 108 #ifdef __WIN32__ 109 osprocess* process = new osprocesswindows(uniRead,prog_name,argv); 110 #else 111 osprocess* process = new osprocessunix(uniRead,prog_name,argv); 74 112 #endif 75 113 … … 86 124 87 125 126 // deleting object will also have the effect of closing any open handles 88 127 delete process; 89 128 90 129 } 130 131 132 133 void test_bi_read_write_pipe() 134 { 135 #ifdef __WIN32__ 136 char* prog_name = "type"; 137 char* argv[] = NULL ; 138 139 #else 140 char* prog_name = "tr"; 141 char* argv[] = { "tr", "[A-Z]", "[a-z]", NULL }; 142 #endif 143 144 // Converts uppercase letters to lowercase 145 // Answer is read back and then printed to STDOUT by this process 146 147 cout << "<hr>" << endl; 148 cout << "<p>Bidirectional Read/Write Test" << endl; 149 cout << "<p> Converts uppercase letters to lowercase" << endl; 150 cout << "<p> Data is sent to child process down pipe by this process" << endl; 151 cout << "<p> Answer is read back from child process and printed to stdout" << endl; 152 cout << "<p>" << endl; 153 154 #ifdef __WIN32__ 155 osprocesswindows* process = new osprocesswindows(biReadWrite,prog_name,argv); 156 #else 157 osprocessunix* process = new osprocessunix(biReadWrite,prog_name,argv); 158 #endif 159 160 char* write_buffer = "TESTING biReadWrite IN CAP\nTesting biReadWrite in Mixed Case\n"; 161 int write_buffer_len = strlen(write_buffer); 162 163 if (!process->write(write_buffer,write_buffer_len)) { 164 cerr << "Error: failed to write to child process\n"; 165 } 166 167 const int BufferSize = 1024; 168 char read_buffer[BufferSize]; 169 process->close_write_pipe(); 170 171 int bytes_read = 0; 172 do { 173 bytes_read = process->read(read_buffer,BufferSize); 174 if (bytes_read>0) { 175 fwrite(read_buffer,1,bytes_read,stdout); 176 } 177 } while (bytes_read==BufferSize); 178 179 180 process->close(); 181 182 delete process; 183 184 } 185 91 186 92 187 int main() … … 100 195 printf( " <body>\n"); 101 196 197 test_uni_read_pipe(); 102 198 test_uni_write_pipe(); 199 test_bi_read_write_pipe(); 103 200 104 201 printf( " </body>\n"); -
main/trunk/greenstone2/runtime-src/src/recpt/os_process.h
r22177 r22183 42 42 43 43 public: 44 osprocess(char* cmdline, OSProcessPipeMode mode); 44 osprocess(OSProcessPipeMode mode, 45 char* prog_name, char* argv[]=NULL, char* envp[]=NULL); 46 45 47 virtual ~osprocess(); 46 48 … … 53 55 virtual int write(char* buffer, const int buffer_len)=0; 54 56 virtual int read(char* buffer, const int buffer_len)=0; 55 57 58 virtual void wait()=0; 59 56 60 virtual bool close_write_pipe(OSProcessWarnStatus warn_status=withWarning)=0; 57 61 virtual bool close_read_pipe(OSProcessWarnStatus warn_status=withWarning)=0; … … 61 65 protected: 62 66 OSProcessPipeMode mode_; 63 64 67 }; 65 68 -
main/trunk/greenstone2/runtime-src/src/recpt/os_process_unix.cpp
r22178 r22183 38 38 39 39 #include <unistd.h> 40 #include <sys/wait.h> 40 41 41 42 #include "os_process_unix.h" 42 43 43 osprocessunix::osprocessunix(char* cmdline, OSProcessPipeMode mode) 44 osprocessunix::osprocessunix(OSProcessPipeMode mode, 45 char* prog_name, char* argv[], char* envp[]) 44 46 : child_stdout_read_(-1), child_stdin_write_(-1), 45 osprocess( cmdline,mode)47 osprocess(mode,prog_name,argv,envp) 46 48 { 47 49 … … 112 114 113 115 114 // execvp? 115 execve(cmdline, NULL, NULL); 116 116 // Used to be execve(), but this would appear not to search path for 117 // 'prog_name'. The alternative execvp() does search PATH and so is 118 // more compatible with how CreateProcess works for Windows 119 120 // Need to connect envp with externally defined '**environ' ?? 121 122 execvp(prog_name,argv); 117 123 118 124 } … … 178 184 179 185 180 186 void osprocessunix::wait() 187 { 188 int child_status; 189 //cerr << "**** waiting ..." << endl; 190 ::waitpid(pid_,&child_status,0); 191 192 //cerr << "*** exit status = " << WEXITSTATUS(child_status) << endl; 193 194 //cerr << "**** done" << endl; 195 } 196 197 181 198 bool osprocessunix::close_write_pipe(OSProcessWarnStatus warn_status) 182 199 { -
main/trunk/greenstone2/runtime-src/src/recpt/os_process_unix.h
r22177 r22183 34 34 #include "os_process.h" 35 35 36 class osprocessunix : osprocess36 class osprocessunix : public osprocess 37 37 { 38 38 39 39 public: 40 osprocessunix(char* cmd, OSProcessPipeMode mode); 40 osprocessunix(OSProcessPipeMode mode, 41 char* prog_name, char* argv[]=NULL, char* envp[]=NULL); 41 42 virtual ~osprocessunix(); 42 43 … … 44 45 virtual int write(char* buffer, const int buffer_len); 45 46 47 virtual void wait(); 48 46 49 virtual bool close_write_pipe(OSProcessWarnStatus warn_status=withWarning); 47 50 virtual bool close_read_pipe(OSProcessWarnStatus warn_status=withWarning); -
main/trunk/greenstone2/runtime-src/src/recpt/os_process_windows.cpp
r22177 r22183 45 45 {} 46 46 47 osprocesswindows::osprocesswindows(char* cmdline, OSProcessPipeMode mode) 47 osprocesswindows::osprocesswindows(OSProcessPipeMode mode, 48 char* prog_name, char* argv[]=NULL, 49 char* envp[]) 48 50 : child_stdout_read_(NULL), child_stdin_write_(NULL), 49 osprocess( cmdline,mode)51 osprocess(mode,prog_name,argv,envp) 50 52 { 51 53 HANDLE child_stdin_read = NULL; … … 102 104 si.hStdInput = child_stdin_read; 103 105 106 text_t cmd_line = ""; 107 if (argv != NULL) { 108 int i=0; 109 while (argv[i] != NULL) { 110 if (i>0) { 111 cmd_line += " "; 112 } 113 cmd_line += "\"" + argv[i] + "\""; 114 i++; 115 } 116 } 117 118 char* cmd_line_cstr = cmd_line.getcstr(); 119 104 120 int rv = CreateProcess(NULL, // no application name 105 cmd line,121 cmd_line_cstr, 106 122 NULL, 107 123 NULL, // no process or thread security attribues … … 112 128 &si, 113 129 &pi_); // process info filled out as a result 130 131 delete [] cmd_line_cstr; 132 114 133 if (!rv) { 115 cerr << "os_process_windows(): Error creating process" << endl;134 cerr << "os_process_windows(): Error creating child process" << endl; 116 135 } 117 136 … … 119 138 120 139 if (!CloseHandle(child_stdout_write)) { 121 cerr << "os_process_windows(): Error closing StdOutWrHandle" << endl;140 cerr << "os_process_windows(): Error closing child's StdOut Write Handle" << endl; 122 141 } 123 142 124 143 if (!CloseHandle(child_stdin_read)) { 125 cerr << "os_process_windows(): Error closing StdInRd Handle" << endl;144 cerr << "os_process_windows(): Error closing child's StdIn Read Handle" << endl; 126 145 } 127 146 } … … 170 189 171 190 191 void osprocesswindows::wait() 192 { 193 WaitForSingleObject(pi_.hProcess, INFINITE); 194 } 172 195 173 196 -
main/trunk/greenstone2/runtime-src/src/recpt/os_process_windows.h
r22177 r22183 35 35 #include <windows.h> 36 36 37 class osprocesswindows : osprocess37 class osprocesswindows : public osprocess 38 38 { 39 39 public: 40 osprocesswindows(char* cmdline, OSProcessPipeMode mode); 40 osprocesswindows(OSProcessPipeMode mode, 41 char* prog_name, char* argv[]=NULL, char* envp[]=NULL); 41 42 virtual ~osprocesswindows(); 42 43 43 44 virtual int read(char* buffer, const int buffer_len); 44 45 virtual int write(const char* buffer, const int buffer_len); 46 47 virtual void wait(); 45 48 46 49 virtual bool close_write_pipe(OSProcessWarnStatus warn_status);
Note:
See TracChangeset
for help on using the changeset viewer.