paulo1205
(usa Ubuntu)
Enviado em 08/01/2016 - 01:00h
XProtoman escreveu:
então vamos supor que um programador faça algo assim:
socket(...)
connect(...)
// Se socket() deu erro checar AGORA o valor de errno.
Você já viu alguém fazendo desse jeito? Só se for alguém muito preguiçoso.
Por que todo mundo evita isso e não faz desse jeito?
Não entendi. Você estava preocupado com que alguém fizesse isso, e agora diz que todo mundo evita?
Porque connect() pode também ter alterado o valor de errno se também deu erro.
Não é esse o motivo. O real motivo é que se socket() falhar -- independentemente da causa refletida no valor de errno --, não fará sentido nenhum tentar chamar connect(), pois não haverá um socket válido sobre o qual se possa tentar realizar uma conexão. Se você insistir com a chamada a connect() com o socket inválido, já saberá de antemão que ela vai retornar falha e vai setar errno com EBADF.
Por que o cara não fez:
socket(...)
// Se socket() deu erro checar o valor de errno.
connect(...)
// Se connect() deu erro checar o valor de errno.
Bom é esse tipo de risco que busco evitar que a maioria também evita.
Não quero ser chato, mas não consigo ver como interferir no valor de errno entre uma chamada e outra pode lhe ajudar. Você temia a perda acidental do valor, e propõe como solução a perda proposital desse valor. Não faz muito sentido para mim.
Sobre "porque você iria querer fazer isso?": estou trabalhando com C++ e transformando os erros de algumas funções que preciso utilizar de C em exceções(exception), então depois que pego o valor de errno penso em sinalizar que está tudo "ok" e limpo defino errno com 0.
Se você está criando uma biblioteca, sugiro que pondere sobre algumas escolhas.
Uma biblioteca, de modo geral, deve ser minimamente intrusiva sobre variáveis globais que possam ser utilizadas oor outras partes do programa. Então, se você não pretende usar errno para
indicar um erro, não impeça outra função ou biblioteca de o fazer (a não ser que você tenha
sólidas razões para esconder a real causa do erro).
Outra consideração deve ser sobre o próprio mecanismo de exceções para sinalização de erros. Se você vai simplesmente envelopar errno na forma
throw std::runtime_error(strerror(errno));, vai usar um mecanismo pesado sem agregar realmente muita informação.