read() a select()(Was: Blokovani v fgets)

Michal Krause mike na navrcholu.cz
Úterý Srpen 4 15:26:25 CEST 1998


Ted jsem s tim trosku laboroval a zjistil jsem, ze pokud je otevrena console a
ne soubor, funkce read() cte automaticky po radcich. Pokud bych ji donutil, aby
stejne fungovala i na FIFO, mel bych po problemu. Pujde to nejak?

Mam ale navic problemy se selectem. Prikladam programek, ktery funguje jak ma
pouze za predpokladu, ze stdin je nepresmerovan - tedy je to klavesnice. Pokud
se program spusti treba takhle: ./select <file, tak dojede na konec souboru a
funkce select() by mela program stopnout az do timeoutu, coz ale neudela. U
souboru je to pomerne logicke, ale u FIFO se da predpokladat, ze data budou
pribyvat, takze by mela blokovat. Nevi nekdo co s tim?

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

int main(void)
{
    fd_set rfds;
    struct timeval tv;
    int retval, result;
    char buf[1024];

    while (1)
    {
        tv.tv_sec = 5;
        tv.tv_usec = 0;

        FD_ZERO(&rfds);
        FD_SET(0, &rfds);

        retval = select(1, &rfds, NULL, NULL, &tv);

        if (retval)
        {
            bzero(buf, 1024);
            result = read(fileno(stdin), buf, 1024);
            if (result == 0)
             continue;
            printf("-%s", buf);
        }
        else
            printf("Data timeout\n");
    }
    exit(0);
}


                                   MK
                                   /\
----------------------------------/  \----------------------------------
Michal Krause - 4WeB         /\  /    \  /\
mailto:mike na navrcholu.cz    /  \/      \/  \           Sluzba Na vrcholu
http://4web.navrcholu.cz/  /    \      /    \   http://www.navrcholu.cz/
ICQ:7665279               /      \    /      \
------------------------------------------------------------------------



Další informace o konferenci Linux