DeA interface de programação Linux:
(Eu li as seções relacionadas. Colei este diagrama resumido apenas para ilustração.)
Eu sei disso para IO direto que usa read
e write
chamadas de sistema. Existem 2 níveis de buffer. read/write buffer
+ kernel buffer
.
Ao usar stdio
chamadas de biblioteca, que são criadas com base em chamadas IO diretas do sistema, é
stdio buffer
++read/write buffer
,kernel buffer
3 níveis de buffer,
ou
stdio
ewrite/read
compartilham o mesmo buffer, 2 níveis de buffer
stdio calls
<---> user buffer
<-----> read/write
+kernel buffer
?
(Acho que são 2 níveis de buffer, mas quero ter certeza.)
Responder1
No caso comum, existem dois níveis. Um buffer no espaço do usuário é alocado pela biblioteca stdio, e chamadas para puts/printf/fprintf etc colocam caracteres nesse buffer. Em algum estágio (por exemplo, o buffer está cheio ou uma nova linha é escrita e o fluxo está no modo de buffer de linha) a biblioteca stdio chama write
para pedir ao kernel para escrever o buffer. O kernel normalmente copiará o buffer em um buffer do kernel, iniciará o que for necessário para levar os dados ao destino e retornar. O espaço do usuário fica então livre para usar o buffer do espaço do usuário como quiser.
É possível (mas incomum) ter diferentes implementações de stdio que façam isso de maneira diferente.sfiotem uma camada de compatibilidade stdio. Vários esquemas foram propostos para zero copy
etc. A questão é que isso stdio
informa qual é o efeito, não como isso é feito.