Суть в следующем. Я перенаправляю stdin , stdout & stderr дочернего процесса способом, описанным в http://msdn2.microsoft.com/en-us/library/ms682499.aspx, то есть использую безымянные (anonumous) пайпы. Но в моем случае имеется такая особенность: мне не известно, сколько байт мне пришлет дочерний процесс. И нет никакого способа узнать, послал он что-то или нет (по крайней мере, я такого способа не знаю). Если на данный момент все байты, переданные дочерним процессом, уже прочитаны, а я делаю еще одну попытку чтения (поскольку мне не известно, все я прочитал или нет), то программа подвисает.
Код | int RedirReadAnswer( char *buf, //Буфер для приема ответа. long buflen) //Длина буфера. { unsigned long bread, offset=0; OVERLAPPED ovr; ovr.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); while(1) { printf("\nRequest to %i symbols\n", buflen-offset-1); //Попытка чтения: ReadFile( ParentRead, (void *)(buf+offset), buflen-offset-1, NULL, &ovr); int k, maxtry=10;//максимальное число попыток. int dT = 1; //Ждем: for(k = 0; k < maxtry; k++) { if(GetOverlappedResult(ParentRead, &ovr, &bread, FALSE) == TRUE) break; WaitForSingleObject(ovr.hEvent, dT); //Ждем dT миллисекунд; } //Если не прочитали данные за отведенное время if(k == maxtry) { CancelIo(ParentRead); printf("/nIO failed/n"); return offset; } offset += bread; buf[offset] = '\0'; // printf("\nRead %i symbols\n", bread); // if(offset >= buflen-1) return 0; } }
|
То есть даже использование структуры OVERLAPPED в вызове ф-ции ReadFile не спасает от подвисания. Что с ней, что без нее - одинаково. Если есть у кого какие соображения - поделитесь, плиз.
|