KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I wrote a code in C/C++ which forks a child process, duplicates the stdin/stdout into a pipe ends and calls execvp. Everything is working fine (i.e. the output from stdin/err/out is captured by the parent process) The problem is that the child stdout is buffered. so if the child code looks like this: printf("Enter any key and hit ENTER:\n"); fgets(line); printf("read: %s\n", line); exit(0); In the parent process I don't see the line 'Enter any key:' - it will be "flushed" only after the program calls exit (which auto flushes the stdout buffer) or an explicit call to 'flush(stdout)' is added I did some research and tried adding a call to disable the stdout buffering by adding a call to: setvbuf(stdout, NULL, _IONBF, 0); just before calling execvp(...) in the parent process so the relevant code looks now like this: int rc = fork(); if ( rc == 0 ) { // Child process if(workingDirectory.IsEmpty() == false) { wxSetWorkingDirectory( workingDirectory ); } int stdin_file = fileno( stdin ); int stdout_file = fileno( stdout ); int stderr_file = fileno( stderr ); // Replace stdin/out with our pipe ends dup2 ( stdin_pipe_read, stdin_file ); close( stdin_pipe_write ); dup2 ( stdout_pipe_write, stdout_file); dup2 ( stdout_pipe_write, stderr_file); close( stdout_pipe_read ); setvbuf(stdout, NULL, _IONBF, 0); // execute the process execvp(argv[0], argv); exit(0); } With no luck. Any ideas? EDIT: here is a sample of the parent code, the only thing needs changing is the path to the child executable: #include <unistd.h> #include <signal.h> #include <sys/types.h> #include <sys/select.h> #include <errno.h> #include <sys/wait.h> #include <string> #include <string.h> #include <cstdio> static int r
Tags (comma-separated)
Save Edits
Cancel