Как перенаправить ввод-вывод через pipe?

106
07 сентября 2019, 11:00

Создаю pipe, запускаю программу - итог висяк. Как проверить что pipe не нужно читать - виснет на чтение pipe. Можно ли перед чтением узнать, в pipe есть информация, или pipe пустой?

Cоздаю процесс

STARTUPINFOA si = {sizeof(si),0};
PROCESS_INFORMATION pi = {0,};
OVERLAPPED ov = {0,};
SECURITY_ATTRIBUTES sa = { sizeof(sa), 0 };
sa.bInheritHandle = 1;
char usr[4]; // Данные
HANDLE waits[2]; // Список ожидающих хандлов 
HANDLE pIn;
HANDLE pOut;
CreatePipe(&pOut,&si.hStdOutput,&sa,1);
CreatePipe(&si.hStdInput,&pIn,&sa,1024);
ov.hEvent = CreateEventA(0,1,0,0);
si.hStdError = si.hStdOutput;
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW ;
si.wShowWindow = SW_HIDE;
waits[0] = pOut;  
int anti = 1000;
bool working = true;
bool read = true;       
int i=0;       
CreateProcessA(0,// какая нибудь консольная
  "c:\\windows\\Microsoft.NET\\Framework\\v2.0.50727\\MSBuild.exe" 
 ,0,0,1,0,"\0\0\0\0",".",&si,&pi);    
waits[1] = pi.hProcess;

Теперь опрос

  while (working) {
   dw = -1;
   if (GetExitCodeThread(pi.hThread,&dw))
     if (dw != 259) break; // Подобрано
  switch (WaitForMultipleObjects(2,waits,0,100)){
     case 0:
        if (read) {
           ReadFile(pOut,usr,1,&dw,&ov); // Тут виснет
           if ((dw == 0) &&(GetLastError() == ERROR_IO_PENDING ))
             read = false;
           } else {
           dw = 0;
           GetOverlappedResult(pOut,&ov,&dw,0);
           if (dw != 0 )
             read = true;
           }
      }

Думал асинхронное чтение спасёт ситуацию - но нет - не работает. Само чтение работает хорошо - получаю все байты, которое отправило консольное приложение в консоль. Но вот "конец посылки" определить не получается.

Microsoft ms-example

READ ALSO
Почему не работает push_back()?

Почему не работает push_back()?

Можете пояснить почему не работает push_back()?

121
Многопоточный калькулятор на Qt [закрыт]

Многопоточный калькулятор на Qt [закрыт]

Задача сделать так, чтобы программа работала в двух потокахНужно искусственно усыплять поток, дабы эмулировать долгие вычисления

138
Запись и чтение из COM порта Linux

Запись и чтение из COM порта Linux

Хочу записать в com-порт и прочитать из него некоторое количество байтС записью проблем вроде бы нет, write ошибок не возвращает

127