Re: fprintf && write

From
Serge Ryabchun ()
To
Andrey Melnikov ()
Date
2003-06-03T15:11:22Z
Area
RU.UNIX.PROG
From: Serge Ryabchun <sr@energy.uch.net>

Andrey Melnikov <Andrey.Melnikov@p116.f1340.n5030.z2.fidonet.org> wrote:
>                                Hello All!
> 
> Что-то у меня лыжи не едут совсем.
> Беру софтину, которая всю свою разумную жизнь работала так:
> 
>   out = fdopen(out_fd, "w");
>   ....
> 
>   fprintf(out, "%s", buffer);
>   ....
> 
> Выкидываю все эти fprintf() и заменяю на свою функцию:
> 
> static char wr_buf[1024];
> write_out (int fd, char *fmt, ...){
>     va_list ap;
>     fd_set wfds;
>     struct timeval tv;
>     int wlen = 0, len, wr;
> 
>     va_start(ap,fmt);
>     (void) vsnprintf(wr_buf,sizeof(wr_buf),fmt,ap);
>     va_end(ap);
> 
>     FD_ZERO (&wfds);
>     FD_SET (fd, &wfds);
>     len = strlen(wr_buf);
> 
>     while (wlen != len){
> 
>           tv.tv_sec = timeout; /* timeout; */
>           tv.tv_usec = 0;
> 
>           if (!select (fd + 1, NULL, &wfds, NULL, &tv)){
>              return -1;
>           }
>         wr = write(fd,wr_buf,len);
> 
>         if (wr < 0){
>            return -1;
>         } else {
>            wlen += wr;
>         }
>     }
> 
>    return 0;
> }
> 
> И скорость падает в 2 (два) с лишним раза. Где я тут неправ ?

Стоп, стоп, стоп. В select wfds модифицируется. IMHO, только первый
раз ты получаеш правильный результат, а дальше отвал только по таймауту.
Потому и падение скорости в 2 раза.
Попробуй FD_ZERO, FD_SET перенести в цикл.

-- 
Serge Ryabchun sr@energy.uch.net
--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)