Dear all,
in these days, we have found a problem we can't solve even after long long googling, so we are here asking your precious help.
In our program instead of using cout to print messages we implemented a custom ostream able to do the following:
Said so, we would like to execute within our software a third party program. The easiest way would be to use the system() call, but in this way all the output will be printed to the standard output and not passing through our custom ostream.
The second step was to try to redirect the cout to our ostream before calling system (and restoring it afterward), but this fails because system() calls fork() and in the new process the stdout and cout are still in sync.
The third step was to look at pipes and we were quite close to what we want. In fact we can redirect the stdout and the stderr to files and, when the program execution is over, we can read back both files passing through our ostream. The problem is that the execution of the external command can last several minutes and during this time interval no messages are printed out, making the user feeling the program is hanging...
So in the end, what we would like to have is the possibility to catch the stdout of an external program and redirect it in real time to a custom ostream, possibly using ostreams and not pipes.
Can you help us?
Thanks,
hilbert
in these days, we have found a problem we can't solve even after long long googling, so we are here asking your precious help.
In our program instead of using cout to print messages we implemented a custom ostream able to do the following:
- Allow the user to choose where to send the messages: on the stdout, in to a file or to any other ostream
- Effectively print the messages only if the verbosity level is reached. I.e. every message has its own verbosity level and if this is below the global user defined verbosity level it is not printed
- Prepend each message with the module name and the verbosity level.
Said so, we would like to execute within our software a third party program. The easiest way would be to use the system() call, but in this way all the output will be printed to the standard output and not passing through our custom ostream.
The second step was to try to redirect the cout to our ostream before calling system (and restoring it afterward), but this fails because system() calls fork() and in the new process the stdout and cout are still in sync.
The third step was to look at pipes and we were quite close to what we want. In fact we can redirect the stdout and the stderr to files and, when the program execution is over, we can read back both files passing through our ostream. The problem is that the execution of the external command can last several minutes and during this time interval no messages are printed out, making the user feeling the program is hanging...
So in the end, what we would like to have is the possibility to catch the stdout of an external program and redirect it in real time to a custom ostream, possibly using ostreams and not pipes.
Can you help us?
Thanks,
hilbert