Castecny zapis do socketu

Michal Dobes dobes na tes.eu
Pátek Květen 2 22:17:48 CEST 2008


Dalibor Straka napsal(a):
>> Aby se nezablokoval, tak musí být deskriptor přepnut do neblokujícího
>>
> Neni pravda: (man poll)
>  POLLOUT      Writing now will not block.

Na tomhle jsem se kdysi dávno pěkně vypekl a zuřil chvíli, než jsem
dospěl k názoru, že se to není zcela pravda. Přesněji, write se mi
choval tak, že byl částečný a vrátilo se to hned zpět v případě, když
délka zapisovaných dat nebyla větší než maximální velikost výstupního
bafru, pokud jsem jedním writem poslal blok větší, tak se  bez 
explicitního nonblock režimu zablokovalo. Pokud se poslal blok menší
a nebylo na celý místo v bafrech, tak proběhl částečný zápis.
Nezkoumal jsem, zda se za posledních X let něco změnilo. Nicméně,
krom toho víc než doporučeného O_NONBLOCK je ještě na pokus pohrát
si s SO_SNDTIMEO.
Možná je i zajímavý status blokování u funkce sendmsg, která se beztak
nakonec interně použije. Pro tu v podstatě platí, že pokud si výslovně
neřeknu o O_NONBLOCK, tak se to zablokovat může i nemusí
(v závislosti na stavu bafrů).

M.



Další informace o konferenci Linux