Existem várias camadas de buffers / caches envolvidos.
-
O cache da CPU.
Os dados são reunidos byte por byte e armazenados no cache da CPU. Se o cache da CPU estiver cheio e os dados não tiverem sido acessados por algum tempo, o bloco contendo nossos dados poderá ser gravado na memória principal. Estes são, na maior parte, ocultos dos programadores de aplicativos.
-
Os buffers em processo.
Existe alguma memória reservada no processo em que os dados são coletados, portanto, precisamos fazer o menor número possível de solicitações ao SO, porque isso é comparativamente caro. O processo copia os dados para esses buffers, que novamente podem ser protegidos por caches de CPU, portanto, não há garantia de que os dados são copiados para a memória principal. O aplicativo precisa esvaziar explicitamente esses buffers, por exemplo, usando fclose (3) ou fsync (3). A função exit (3) também faz isso antes que o processo seja finalizado, enquanto a função _exit (2) não , razão pela qual há um grande aviso na página de manual para que essa função o chame. somente se você souber o que está fazendo.
-
Os buffers do kernel
O sistema operacional mantém seu próprio cache, para minimizar o número de solicitações que ele precisa enviar aos discos. Esse cache não pertence a nenhum processo em particular, portanto, os dados podem pertencer a processos que já terminaram e, como todos os acessos passam por aqui, o próximo programa verá os dados, se tiver chegado aqui. O kernel gravará esses dados nos discos quando tiver tempo para fazê-lo ou quando solicitado explicitamente.
-
O cache da unidade
As próprias unidades de disco também mantêm um cache para acelerar os acessos. Elas são gravadas com bastante rapidez e há um comando para gravar os dados restantes nos caches e informar quando isso estiver concluído, o que o sistema operacional usa no desligamento para garantir que nenhum dado seja deixado sem ser gravado antes de ser desativado.
Para sua aplicação, é suficiente que os dados sejam registrados nos buffers do kernel (os dados reais ainda podem viver em caches de CPU neste momento, e podem não ter sido gravados na memória principal): o processo "echo" termina, o que significa que quaisquer buffers em processo devem ter sido liberados e os dados entregues ao sistema operacional e, quando você inicia um novo processo, é garantido que o SO retornará os mesmos dados quando solicitado.