The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Странное поведение select(2)"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Странное поведение select(2)"
Сообщение от nd Искать по авторуВ закладки on 20-Янв-02, 18:10  (MSK)
select(2) не работает в коде типа этого:
...
char buf[256];
int len;
fd_set set;
int f=open("test", O_RDONLY);
if(f==-1) { perror("test"); exit(1); }
while(1)
{ FD_ZERO(&set);
  FD_SET(f, &set);
  if(select(f+1, &set, NULL, NULL, NULL)==1)
  { if((len=read(f, buf, 256))!=0)
      write(1, buf, len);
    else
    { printf("select()=1, but read()=0!\n");
      fflush(stdout);
    }
  }
  else
    printf("select()!=1\n");
}
...

В результате выполнения программа выдаёт сначала содержимое файла test (как и должно быть), а вот потом начинает выдавать "select()=1, but read()=0!", причем постоянно и без пауз, т.е. select(2) возвращает '1' сразу, хотя читать и нечего. Что я не так делаю!? Замумукался уже!

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: Странное поведение select(2)"
Сообщение от Soldier Искать по авторуВ закладки on 21-Янв-02, 11:09  (MSK)
>select(2) не работает в коде типа
>этого:
>...
>char buf[256];
>int len;
>fd_set set;
>int f=open("test", O_RDONLY);
>if(f==-1) { perror("test"); exit(1); }
>while(1)
>{ FD_ZERO(&set);
>  FD_SET(f, &set);
>  if(select(f+1, &set, NULL, NULL,
>NULL)==1)
>  { if((len=read(f, buf, 256))!=0)
>
>      
>write(1, buf, len);
>    else
>    { printf("select()=1,
>but read()=0!\n");
>      
>fflush(stdout);
>    }
>  }
>  else
>    printf("select()!=1\n");
>}
>...
>
>В результате выполнения программа выдаёт сначала
>содержимое файла test (как и
>должно быть), а вот потом
>начинает выдавать "select()=1, but read()=0!",
>причем постоянно и без пауз,
>т.е. select(2) возвращает '1' сразу,
>хотя читать и нечего. Что
>я не так делаю!? Замумукался
>уже!

Neskol'ko izvraschenniy kod nado skazat'. I select zdes' ni prichem - pered fflush ili posle postav'te close(f), i  stroki
>  else
>    printf("select()!=1\n");
zamenite na
  else {
    printf("select()!=1\n");
    break;
  }

A to on teper' neprerivno select()!=1 vidavat' budet.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: Странное поведение select(2)"
Сообщение от Soldier Искать по авторуВ закладки on 21-Янв-02, 11:09  (MSK)
>select(2) не работает в коде типа
>этого:
>...
>char buf[256];
>int len;
>fd_set set;
>int f=open("test", O_RDONLY);
>if(f==-1) { perror("test"); exit(1); }
>while(1)
>{ FD_ZERO(&set);
>  FD_SET(f, &set);
>  if(select(f+1, &set, NULL, NULL,
>NULL)==1)
>  { if((len=read(f, buf, 256))!=0)
>
>      
>write(1, buf, len);
>    else
>    { printf("select()=1,
>but read()=0!\n");
>      
>fflush(stdout);
>    }
>  }
>  else
>    printf("select()!=1\n");
>}
>...
>
>В результате выполнения программа выдаёт сначала
>содержимое файла test (как и
>должно быть), а вот потом
>начинает выдавать "select()=1, but read()=0!",
>причем постоянно и без пауз,
>т.е. select(2) возвращает '1' сразу,
>хотя читать и нечего. Что
>я не так делаю!? Замумукался
>уже!

Neskol'ko izvraschenniy kod nado skazat'. I select zdes' ni prichem - pered fflush ili posle postav'te close(f), i  stroki
>  else
>    printf("select()!=1\n");
zamenite na
  else {
    printf("select()!=1\n");
    break;
  }

A to on teper' neprerivno select()!=1 vidavat' budet.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: Странное поведение select(2)"
Сообщение от nd Искать по авторуВ закладки on 23-Янв-02, 00:40  (MSK)
Небольшое дополнение. Я не сказал для чего мне это всё было нужно, так вот требуется выводить (с некоторой обработкой) растущий файл. Типа как tail -f это делает. Только tail (по крайней мере GNU'тый, исходниками которого я располагаю) делает так: читает из файла конец, если ничего не прочиталось - делает sleep() и всё поновой. Мне показалось это не совсем красиво, в связи с чем и хотелось использовать select(). А может select с обычными файлами вообще нельзя использовать?
  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "RE: Странное поведение select(2)"
Сообщение от Soldier Искать по авторуВ закладки on 23-Янв-02, 12:28  (MSK)
>Небольшое дополнение. Я не сказал для
>чего мне это всё было
>нужно, так вот требуется выводить
>(с некоторой обработкой) растущий файл.
>Типа как tail -f это
>делает. Только tail (по крайней
>мере GNU'тый, исходниками которого я
>располагаю) делает так: читает из
>файла конец, если ничего не
>прочиталось - делает sleep() и
>всё поновой. Мне показалось это
>не совсем красиво, в связи
>с чем и хотелось использовать
>select(). А может select с
>обычными файлами вообще нельзя использовать?
>
Da mozhno ego ispol'zovat'.   Nizhe izmenenniy code:

char buf[256];
int len;
fd_set set;
int f=open("test", O_RDONLY);
if(f==-1) { perror("test"); exit(1); }
while(1)
{ FD_ZERO(&set);
  FD_SET(f, &set);
  if(select(f+1, &set, NULL, NULL, NULL)==1)
  { if((len=read(f, buf, 256))!=0)
      write(1, buf, len);
    else
    {
      fflush(stdout);
      continue;
    }
  }
  else
    printf("select()!=1\n");
}
...

Teper'  dolzhno rabotat' kak tail -f (nadeyus')

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру