O loop principal do GNU cat, no caso mais simples é (function
simple_cat
de cat.c
):
while (true)
{
/* Read a block of input. */
n_read = safe_read (input_desc, buf, bufsize);
/* ... */
}
Em seguida, a pergunta se torna "como está bufsize
set?" A resposta é que é
usando io_blksize
( insize = io_blksize (stat_buf)
), que é
definido da seguinte forma:
io_blksize (struct stat sb)
{
return MAX (IO_BUFSIZE, ST_BLKSIZE (sb));
}
onde ST_BLKSIZE fornece a ideia do sistema operacional do arquivo
tamanho de bloco de E / S preferido do sistema (conforme acessado usando stat
) e
IO_BUFSIZE é definido como 128 * 1024 (128 KB). Aqui está um trecho do
Documentação do Linux stat
syscall:
blksize_t st_blksize; /* blocksize for file system I/O */ (...)
The st_blksize field gives the "preferred" blocksize for efficient
file system I/O. (Writing to a file in smaller chunks may cause
an inefficient read-modify-rewrite.)
Então parece que o GNU cat vai ler blocos de 128KB ou o arquivo tamanho de bloco de E / S recomendado pelo sistema, o que for maior.