Здравствуйте, AlexP, Вы писали:
AP>Функция fprintf использует внутреннюю буферизацию. И первым происходит запись в поток stderr, так как туда пишется гораздо больше данных. Так как родительский процесс ожидает данные из stdout, он не вычитывает stderr и как только внутренний буфер pipe переполняется, дочерняя программа зависает — ожидает когда освободится буфер stderr.
Да, про буфферизацию я уже раскопал на msdn forums, только вот способа решить эту проблему там так и не нашли вроде (или я еще не все раскопал).
Обойти это никак нельзя, не переписывая чилдовое приложение (сторонняя программа, да и не известно, что еще могут подсунуть)?
В случае с доступом к исходным кодам это решается либо через fflush, либо через вызов setvbuf для stderr и stdout с выставлением флага _IONBF. Нет ли способа выставить этот флаг из родительского приложения (причем C-runtime юзать нельзя, ибо родительское приложение не на C пишется)? Может API какое-нибудь существует? просто setvbuf в качестве аргумента принимает FILE*, а соответствия между хендлом, который передается из родительского процесса и stderr (типа FILE*) я не нашел.