Osaiskohan joku vähän valaista, että
miten tuo select() -funktio c-ohjelmoinnissa
oikein käytännössä toimii? Olen lukenut
man sivuja ja etsinyt netistä, mutta
en oikein löydä käytännön esimerkkiä
mistään.
Eli, jos ohjelmassani on 10 putkea,
joista olisi tarkoitus lukea dataa,
ja selelect() ilmoittaa, että kolmessa
on dataa valmiina, niin mistä tiedän
missä niistä? Täytyykö käydä kaikki
läpi järjestyksessä?
Olen tehnyt pienen ohjelman, jossa
select() funktiolla odotetaan dataa
kolmeen putkeen. Ohjelma on
suurinpiirtein seuraavanlainen
do
{
if((retval = select(highest_fd+1, &rfds, NULL, NULL, &tv)) == -1) // retval on joka kerta 3
{
perror("select");
exit(EXIT_FAILURE);
}
else if(retval == 0)
{
printf("no descriptors ready\n");
}
else
{
printf("data available in %d file descriptor(s) \n", retval);
for(i = 0 ; i < N ; i++)
{
if((in = read(arr[i].fd[0], buf, sizeof(buf))) == -1) // tämä on surempi kuin 0 vain ensimmäisellä kerralla
{
perror("read");
exit(EXIT_FAILURE);
}
else if(in == 0)
{
printf("no data in buffer for fd %d \n", arr[i].fd[0]);
}
else
{
printf("reading from fd %d \n", arr[i].fd[0]);
printf("msg: %s \n", buf);
}
}
}
sleep(3);
}
Eli kun ohjelmassa päästä select() vaiheeseen
on kaikissa kolmessa putkessa dataa ja
ohjelma ilmoittaa, "data available in 3 file descriptor(s)"
ja tämän jälkeen lukee for -loopissa kaikista datan
ja printtaa sen ruudulle. Tämän jälkeen odotetaan
3 sekuntia ja palataan alkuun.
Toisella kierroksella ilmoitetaan jälleen, että
kolmessa putkessa on dataa
, ja siirrytään
lukemaan dataa putkista. read() -funktio
ilmoittaa, kuten pitääkin, että dataa ei ole luettavissa.
Tämä jatkuu loputtomiin.
Miksi select() ilmoittaa joka kerta, että kolmessa
putkessa on dataa vaikka se on jo luettu sieltä?
Eikö read() -funktion tulisi tyhjentää puskuri
lukemisen jälkeen?
Toivottavasti joku C:tä paremmin osaava
osaa neuvoa. Kiitos.