Poprawny kod - nie blokująca rura z popenem
Istnieje mnóstwo pytań dotyczących rur nieblokujących, ale nie ma przykładów kodu, który można skopiować i wkleić (z małą korektą) i użyć.
Mam pomysł i źródła z tego wątku:Rura nie blokująca za pomocą popen?
Ale jak go używać? Wwhile
cykl? Sprawdź moje zmiany. Czy naprawdę trzeba z niego korzystaćerrno == EAGAIN
i dodatkowy nagłówek#include <cerrno>
? Zaproponuj własną lepszą wersję, jeśli to konieczne:
FILE *pipe;
char buff[512];
if ( !(pipe = popen( command.c_str(), "r")) ) return false;
int d = fileno(pipe);
while ( true )
{
ssize_t r = read(d, buff, sizeof(buff));
if (r == -1 && errno == EAGAIN) // really need errno?
continue;
else if (r > 0)
ptr_output->append(buff);
else
break;
}
pclose(pipe);