Win32, named pipe, ReadFile with overlapped.
От: fk0 Россия  
Дата: 18.01.21 12:01
Оценка:
Hello...

Помогите, а то я рехнусь и в дурку сдамся. Ситуация:

1) создаём named pipe, примерно как здесь описано: https://stackoverflow.com/questions/60645/overlapped-i-o-on-anonymous-pipe
2) делаем SetStdHandle(STD_OUTPUT_HANDLE, writing_end_of_the_pipe);
3) делаем _dup2(_sfopen_handle(writing_end_of_the_pipe), _fileno(stdout));
4) делаем fputs("blablabla...", stdout), fflush(stdout);
5) делаем ReadFile(reading_end_of_the_pipe, с overlapped-структурой и евентом);
6) ждём евента;
7) вызываем GetOverlappedResult, откуда получаем размер считанных данных -- он соответсвует длине "blablabla..."

Проблема: в самих прочитанных данных первый байт 0xCD, остальные верные. Длина верная. Причём в буфере сразу появляется сообщение (записанное из fputs) с попорченным первым байтом, в момент возврата из ReadFile.

Удалось выяснить, что msvcrt ведет себя странно: вначале пишет без буферизации один байт в пайп (но пишет правильный байт, не 0xCD), потом остаток строки копирует в буфер. И последующий fflush остаток строки записывает в пайп. ReadFile мог делаться как одновременно с записью, так и до записи в пайп, результат всегда один -- первый байт 0xCD.

Что за чертовщина???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.