URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 421
[ Назад ]

Исходное сообщение
"Странное поведение select(2)"

Отправлено nd , 20-Янв-02 18:10 
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' сразу, хотя читать и нечего. Что я не так делаю!? Замумукался уже!


Содержание

Сообщения в этом обсуждении
"RE: Странное поведение select(2)"
Отправлено Soldier , 21-Янв-02 11:09 
>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.


"RE: Странное поведение select(2)"
Отправлено Soldier , 21-Янв-02 11:09 
>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.


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

"RE: Странное поведение select(2)"
Отправлено Soldier , 23-Янв-02 12:28 
>Небольшое дополнение. Я не сказал для
>чего мне это всё было
>нужно, так вот требуется выводить
>(с некоторой обработкой) растущий файл.
>Типа как 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')