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' сразу, хотя читать и нечего. Что я не так делаю!? Замумукался уже!
>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.
>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.
Небольшое дополнение. Я не сказал для чего мне это всё было нужно, так вот требуется выводить (с некоторой обработкой) растущий файл. Типа как tail -f это делает. Только tail (по крайней мере GNU'тый, исходниками которого я располагаю) делает так: читает из файла конец, если ничего не прочиталось - делает sleep() и всё поновой. Мне показалось это не совсем красиво, в связи с чем и хотелось использовать select(). А может select с обычными файлами вообще нельзя использовать?
>Небольшое дополнение. Я не сказал для
>чего мне это всё было
>нужно, так вот требуется выводить
>(с некоторой обработкой) растущий файл.
>Типа как 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')