LINUX.ORG.RU

select() и /dev/ttSx


0

0

Проблема такая: надо начать что-то делать в тот момент когда в ttySn (модем) появляются данные (RING в данном случае) Как я понял, это делается путем вызова select() и в случае если он вернет не 0, то значит нам для чтения доступны данные. Но в случае с ttSn это дело не работает - т.е. модем что-то там сказал, а select() утверждает, что ничего, мол, не происходит. С fifo и просто файлами все работает, а с портом - нет =( Может кто родскажет, где копать? Какие-нибудь фокусы с ioctl()?


А если просто читать с блокировкой. Как прочитаешь так вывалишся из write. Только надо косоль настроить. tsetattr()

anonymous
()

из read конечно

anonymous
()

Не, так не пойдет =( Если постоянно пытаться читать будет большая загрузка cpu, а если читать с перерывами (sleep()/usleep()) то можно (хотя маловероятно) что-нить прозевать =) в обжем это выход, конечно, но крайне нежелательный. Хотелось бы узнать как все это проделать именно путем всяких там select()/poll()...

juno106
() автор топика

Вообще то read в случае block не должен возвращаться пока не получит данные.

Еще, покажи как ты делаешь select.

Banshee
()

Делаю все таким вот образом:
_____

fd_set fdset;
struct timeval n;
...    
if((port_fd = open("/dev/tts/1", O_RDWR|O_NOCTTY|O_NONBLOCK)) == -1)
  { perror("open"); exit(1); }
else
  {
  ...
  while(1)
    {
    FD_ZERO();
    FD_SET(port_fd, );
    n.tv_sec = timeout;
    n.tv_usec = 0;
    if(retval = select(fd+1, , NULL, NULL, ))
      ... (порт что-то сказал - читаем это и что-то там делаем) ...
    else
      ... (ничего не прилетело за n сек.) ...
    }
  }

juno106
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.