Я хочу, чтобы работающий поток не блокировался на время ожидания данных от char-устройства (на Blackfin у меня в данном случае это sport0). Надеюсь я правильно выразился.
Для этого согласно описанию на драйвера устройств -
http://docs.blackfin.uclinux.org/doku.php?id=select_and_poll - я использую функцию poll().
Код
sport0fd = open("/dev/sport0", O_RDWR, 0);
if (!sport0fd)
{
perror("Failed open sport0.\n");
exit(-1);
}
fds[0].fd = sport0fd;
fds[0].events = POLLIN;
pollresult = poll(&fds[0], 1, ACK_TIMEOUT_20MS);
switch (pollresult)
{
case 0:
printf("timeout.\n");
errors.err_register |= ERR_TIMEOUT;
break;
case -1:
perror("poll() error.\n");
exit(-1);
default:
if ( fds[0].revents & POLLIN )
{
printf("read.\n");
*size = read(fds[0].fd, buf, sizeof(buf));
}
}
На sport0 я никаких данных в данный момент не передаю. Т.е. взяться им неоткуда. Так вот оказывается, что я всё-равно попадаю в ветку if (revents & POLLIN). Но данные функцией read() вычитать не могу (оно и понятно данных ведь нет). И поток благополучно блокируется.
или POLLIN всего лишь означает, что "я могу считать данные из устройства, заданного таким-то дескриптором" - "POLLIN = Set when normal data can be read without blocking".
Пробовал установить свойство дескриптора sport0, как O_NONBLOCK:
Код
if( fcntl(fds[0].fd, F_SETFL, O_NONBLOCK) != 0)
perror("Fcntl -- could not set nonblocking\n");
не помогло.
В какую сторону копать? Спасибо.