Quais são as consequências da chamada write() com comprimento zero?
-
12-09-2019 - |
Pergunta
Em nível bastante elevado, o Linux write (), função que filtra os pedidos para escrever 0 comprimento de buffers.O que faz sentido.Quem quer SO perder é hora de perfuração através de camadas apenas para determinar não há nenhum trabalho para ser feito?
Bem ...a mim.
Ele é relacionado a esse pergunta;e a descoberta de que o bit-bateu I2C driver dará uma potencialmente útil do código de retorno se o endereço (emitido no barramento de dados) vai dar um erro se o handshaking é errado.
Alguém poderia enviar dados fictícios após o endereço, mas não com o dispositivo estou usando.(Talvez eu vou tentar uma leitura ...).
Então a pergunta é: Que tipo de inferno seria desencadeada se o kernel para permitir que eram zero (0) comprimento escreve?
Solução 2
Apenas por causa do fechamento, vou com a idéia de Warren Young de atualizar o motorista e publicar o patch (quando eu conseguir uma rodada tuit).
Outras dicas
O que você está descrevendo equivale a essencialmente o mesmo tipo de mal que infesta várias APIs do Windows que precisam de quantidades imprevisíveis de memória. A prática é chamá -los sem buffer para colocar seu trabalho, eles fazem o trabalho de qualquer maneira, sem armazenar os resultados, mas contando o número de bytes que precisariam ao longo do caminho. Em seguida, você aloca um buffer desse tamanho e chama a função novamente com o buffer, sabendo o tamanho.
Isso é indescritivelmente mau. É a programação de computadores equivalente a uma burocracia deteriorada, onde cada departamento exige que você preencha um formulário que tenha a maioria das mesmas informações sobre ele que a que você deu ao departamento anterior, mas como existem informações diferentes sobre cada formulário, Eles não vão apenas pegar uma cópia do formulário que você deu aos outros caras. Ptui!
O tempo do programador é caro, o tempo da CPU é barato. Exigindo que os programadores escrevam a mesma chamada de API N TIMES para divulgar algum estado mundial de que a própria API poderia funcionar por conta própria tenta virar isso de cabeça para baixo.
A melhor prática, então, é fazer com que o motorista faça tudo o que puder para garantir que sua gravação () seja bem -sucedida. Se for possível prever com antecedência que não pode ter sucesso verificando algum estado do mundo, talvez isso deva ser um ioctl ().
Muito pouco, eu pensava - pode ser possível que uma gravação de comprimento zero bloqueasse se o buffer que ele está escrevendo também não tivesse espaço disponível, em alguns motoristas. A proibição de gravações de comprimento zero pode tornar as coisas mais simples em casos como esse - além de evitar muito trabalho desperdiçado.
Por que não remover essa verificação e ver que tipo de inferno realmente se solta? :)
Não é uma resposta séria: você pode obter um programa como toque : P
Estremeço a sugerir um ioctl (), mas isso não seria uma interface melhor para obter informações de estado sobre a interface?
O que seria um comprimento zero escrever significa?Em geral, a escrita significa a transferência de dados...e tenho certeza de mais problemas seriam causados pela não verificação para ele e, assim, a captura de mais muitos maus entrada para os motoristas.y
se é um único bit de informação "fazer isso", chamada que você está depois, eu acho que ioctl é o caminho a percorrer.Ele não é bonito, mas o que você pode fazer?
Como alternativa, apanhe a opção nuclear, use mmap() e mover a coisa toda em espaço de usuário.Baixo overhead, e você pode escrever o clássico poke código como "escrever X para este register", que quase parece que é o que você precisa.