UPDATE: Я обновил код и описание проблемы, чтобы отразить мои изменения.Что не так с этим примером _popen/select?
Теперь я знаю, что я пытаюсь выполнить операцию сокета на несете. или что мой fd_set не действует так:
select
возвращает -1 и WSAGetLastError()
возвращается 10038.
Но я не могу показаться, чтобы выяснить, что это такое. Платформа - это Windows. Я не размещал часть WSAStartup
.
int loop = 0;
FILE *output
int main()
{
fd_set fd;
output = _popen("tail -f test.txt","r");
while(forceExit == 0)
{
FD_ZERO(&fd);
FD_SET(_fileno(output),&fd);
int returncode = select(_fileno(output)+1,&fd,NULL,NULL,NULL);
if(returncode == 0)
{
printf("timed out");
}
else if (returncode < 0)
{
printf("returncode: %d\n",returncode);
printf("Last Error: %d\n",WSAGetLastError());
}
else
{
if(FD_ISSET(_fileno(output),&fd))
{
if(fgets(buff, sizeof(buff), output) != NULL)
{
printf("Output: %s\n", buff);
}
}
else
{
printf(".");
}
}
Sleep(500);
}
return 0;
}
Новый результат - это, конечно, распечатка кода возврата и последней ошибки.
Ваш комментарий к первому аргументу для выбора, который необходимо установить правильно, верен для сокетов Berkeley. это не так в Windows. Параметр не используется (хотя он все равно должен быть правильно установлен IMHO!). Poseter не определил платформу, поэтому я подумал, что буду указывать на разные платформы. – Mark 2008-09-30 12:49:28
платформа действительно Windows. Извините, что вы не публикуете, что – SinisterDex 2008-09-30 13:00:48