socket programming (BSD like)
Jirka Kosina
jikos na jikos.cz
Středa Únor 6 10:08:38 CET 2002
On Tue, 5 Feb 2002, Richard Willmann, PC Revue wrote:
> > Takze pokud se chcete vyhnout zablokovani uvnitr read(), resp() write,
> > budete muset ten socket oznacit jako neblokujici.
> ano, selekt resp. poll povie ze da sa citat/pisat/vyskytla sa chyba. otazkou
> je, ze ci ak zavolam read() s bufferom velkosti 10KB sa mi vrati 1KB (to co
> uz je pripravene v kerneli) alebo to bude cakat na dalsich 9KB. Pri read() a
> write() je napisane, ze to moze vratit menej nez je velkost bufferu a preto
> treba citat dokola az kym to nevrati nulu ze EOF.
Jak uz psal Stano, je to implementacne zavisle, a na chovani se neda
spolehat, nevim, ze by to stanovovala nejaka norma (ale mozna ano).
Kazdopadne v linuxu se to chova tak, ze read() skutecne vrati to, co ma
jadro ve fronte, a jako navratovou hodnotu dostanete kolik se toho
skutecne nacetlo.
Takze ja ve svych programech pouzivam neco jako
int write_n(int fd,char *ptr, int count)
{
int left, written;
left=count;
while(left > 0){
written = write(fd,ptr,left);
if(written <= 0)
return(written);
left -= written;
ptr += written;
}
return(count - left);
}
S read() naprosto obdobne.
> Btw: nie je tam nejaky watermark? tusim som niekde videl, ze sa da nastavit
> velkost kerneloveho bufferu pre citanie/zapis.
No, to asi ve zdrojacich jadra, ze by tomu odpovidalo nejake sysctl nevim,
ale je to klidne mozne.
--
JiKos.
Další informace o konferenci Linux