Can I capture stdout/stderr separately and maintain original order?
redirect, stderr, stdout, winapi
Solution
I'm pretty sure it can't be done, short of writing the spawned program to write in packets and add a time-stamp to each. Without that, you can normally plan on buffering happening in the standard library of the child process, so by the time they're even being transmitted through the pipe to the parent, there's a good chance that they're already out of order.
Problem
I've written a Windows application using the native win32 API. My app will launch other processes and capture the output and highlight stderr output in red. In order to accomplish this I create a separate pipe for stdout and stderr and use them in the STARTUPINFO structure when calling CreateProcess. I then launch a separate thread for each stdout/stderr handle that reads from the pipe and logs the output to a window. This works fine in most cases. The problem I am having is that if the child process logs to stderr and stdout in quick succession, my app will sometimes display the output in the incorrect order. I'm assuming this is due to using two threads to read from each handle. Is it possible to capture stdout and stderr in the original order they were written to, while being able to distinguish between the two?