paulo1205
(usa Ubuntu)
Enviado em 25/03/2015 - 23:37h
isacmarques escreveu:
Bom dia,
Paulo Estou com uma duvida neste tópico, fiz todo o processo dei uma lida em alguns materiais sobre sinais em C e me ficou uma duvida.
No exemplo que me passou eu o implementei para caso o mesmo não consiga ler uma determinada informação do READ ele pule fora do mesmo e não fique com o processo parado, no entanto agora eu tenho a necessidade de refazer o read ou seja tentar ler novamente.
Nada impede de fazer, mas você tem de tomar cuidado de proteger também o segundo
read() contra timeout, ou a proteção do primeiro terá sido inútil.
Na parte abaixo:
if(n_read==-1){
if(read_err==EINTR){
/* read() foi interrompido (timeout) */
}
else{
/* Outro tipo de erro de leitura. */
}
Eu posso estar colocando a 2 tentativa de leitura dentro do if (read_err==EINTR) ? no sa.saflags =0 posso solicitar que ele reinicie o read novamente ? Ou é melhor que caso eu não receba nada pela função READ eu envie os dados novamente e aguardo novamente o read tentar receber essas informações. O que você melhor me indica para uma aplicação que terá uma rede grande.
Desde já muito obrigado pela sua ajuda e de todos que colaboram no viva o linux.
Não acho que seja uma boa ideia colocar dentro do tratamento de timeout uma segunda leitura que também pode dar timeout. Acredito que uma saída melhor seja ter um loop de I/O, e implementar uma máquina de estados para controlar as ações a tomar em cada repetição desse loop.
Não acredito que usar o flag
SA_RESTART tenha serventia também. Muito provavelmente atrapalharia a detecção do timeout.
Uma coisa que você poderia fazer seria usar
select() ou
pool() para esperar por dados na entrada, em lugar de usar um timer.
Mas tudo isso é meio acessório. Uma coisa muito importante que, se você ainda não tiver feito, eu recomendo fortemente que pare o desenvolvimento para realizar antes de prosseguir é planejar bastante como será o funcionamento da rede. Das conversas que tivemos até agora, parece que você ainda está com problemas de comunicação básica, em nível de hardware e enlace de dados, mas já falou em comunicação multiponto, e eu temo que você possa estar tentando fazer tudo ao mesmo tempo. Acho que separar a coisa em níveis, como num modelo OSI (http://en.wikipedia.org/wiki/OSI_model) ou da Internet (http://en.wikipedia.org/wiki/Internet_protocol_suite), e desenvolver aos poucos, do nível mais baixo para os mais altos, pode facilitar sua vida.