From: SourceForge.net <no...@so...> - 2005-11-18 15:42:09
|
Read and respond to this message at: https://sourceforge.net/forum/message.php?msg_id=3433439 By: andyrobertson Folks, I have had some success under *NIX using pipes, processes and fork to have a C++ GUI control some console based fortran code. Under MINGW I understand That I need to use the Windows API CreateProcess and CreatePipe. I have found several examples on the web on this and other sites were people indicate that they have succeded in doing this. However, I cannot. I can fire up the child process succesfully but I cannot seem to read the childs process stdout. I am trying to do this before I try writing to the childs stdin. I have included the code below. What little detail of the pipes am I missing? I have also attached my child code for completeness. Any insight would be appreciated Thanks - Andy Robertson #include <windows.h> #include <stdio.h> #define MAX_BUFFER_SIZE 512 int RunExecutableFile() { STARTUPINFO sti = { 0 }; SECURITY_ATTRIBUTES sats = { 0 }; PROCESS_INFORMATION pi = { 0 }; HANDLE pipin_w, pipin_r, pipout_w, pipout_r; BYTE buffer[MAX_BUFFER_SIZE]; DWORD writ, excode, read, available; int ret = 0; pipin_w = pipin_r = pipout_w = pipout_r = NULL; //set SECURITY_ATTRIBUTES struct fields sats.nLength = sizeof(sats); sats.bInheritHandle = TRUE; sats.lpSecurityDescriptor = NULL; //create child's stdout pipes if(!CreatePipe(&pipout_r, &pipout_w, &sats, 0)) { fprintf(stderr,"Unable to create childs stdout pipe\n"); return -1; } //and its stdin pipes if(!CreatePipe(&pipin_r, &pipin_w, &sats, 0)) { fprintf(stderr,"Unable to create childs stdin pipe\n"); return -1; } printf("Created pipes\n"); //now set STARTUPINFO struct fields (from the child's point of view) sti.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; sti.wShowWindow = SW_HIDE; sti.hStdInput = pipin_r; sti.hStdOutput = pipout_w; sti.hStdError = pipout_w; //create the process... if(!CreateProcess(NULL, "Test.exe", &sats, &sats, TRUE, 0, NULL, NULL, &sti, &pi)) { printf("Unable to generate process \n"); return -1; } printf("Created process \n"); //make sure process is still running GetExitCodeProcess(pi.hProcess, &excode); if(excode != STILL_ACTIVE) return -1; printf("Process still running\n"); //now wait till the process says something int i = 0; for(;i<=1;) { printf("Looping around peek\n"); if(!PeekNamedPipe(pipout_r, buffer, sizeof(buffer), &read, &available, NULL)) { printf(" peaked and found something \n"); printf("Value of read %d",read); printf("Value of available %d",available); i = 1; } else { printf(" peaked and found nothing \n"); } //make sure process is still running GetExitCodeProcess(pi.hProcess, &excode); if(excode != STILL_ACTIVE) {printf("Process seems to have stopped\n"); return -1; } printf("Process still running\n"); } //now read that pipe ReadFile(pipout_r, buffer, sizeof(buffer), &read, NULL); printf(" I got - \n",buffer); // Close process and thread handles. if(pipin_w != NULL) CloseHandle(pipin_w); if(pipin_r != NULL) CloseHandle(pipin_r); if(pipout_w != NULL) CloseHandle(pipout_w); if(pipout_r != NULL) CloseHandle(pipout_r); if(pi.hProcess != NULL) CloseHandle(pi.hProcess); if(pi.hThread != NULL) CloseHandle(pi.hThread); exit(0); } int main(int argc, char *argv[]) { RunExecutableFile(); fprintf(stderr,"Got back to main!\n"); return 0; } ----CHILD CODE #include <windows.h> #include <stdio.h> using namespace std; int main() { for (int i = 0; i < 100; i++) { fprintf(stdout,"Hello World- %d\n",i); fflush(stdout); Sleep(100); } return 0; } ______________________________________________________________________ You are receiving this email because you elected to monitor this forum. To stop monitoring this forum, login to SourceForge.net and visit: https://sourceforge.net/forum/unmonitor.php?forum_id=286529 |