Câu trả lời:
Vòng lặp chính của GNU GNU, trong trường hợp đơn giản nhất là (hàm
simple_cat
từ cat.c
):
while (true)
{
/* Read a block of input. */
n_read = safe_read (input_desc, buf, bufsize);
/* ... */
}
Sau đó, câu hỏi trở thành "làm thế nào được bufsize
thiết lập?" Câu trả lời là nó sử dụng io_blksize
( insize = io_blksize (stat_buf)
), được định nghĩa như sau:
io_blksize (struct stat sb)
{
return MAX (IO_BUFSIZE, ST_BLKSIZE (sb));
}
trong đó ST_BLKSIZE cho ý tưởng của hệ điều hành về kích thước khối I / O ưa thích của hệ thống tệp (như được truy cập bằng cách sử dụng stat
) và IO_BUFSIZE được định nghĩa là 128 * 1024 (128KB). Đây là một đoạn trích của stat
tài liệu tòa nhà Linux :
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.)
Vì vậy, có vẻ như con mèo GNU sẽ đọc trong các khối 128KB hoặc kích thước khối I / O được đề xuất của hệ thống tệp, tùy theo kích thước nào lớn hơn.
stat -f -c %s file
để tìm kích thước khối của hệ thống tập tin trong đó tập tin đầu vào là? Không phải kích thước khối của hệ thống tệp nơi tệp đầu ra đang có vấn đề? Và những gì về sao chép, ví dụ / dev / zero vào một thiết bị khối thô?
stat -f -c %s file
cho phép bạn truy cập giá trị đó từ dòng lệnh. Kích thước khối hệ thống tệp đầu ra được tính đến, tôi đã bỏ qua phần đó nhưng sẽ mở rộng câu trả lời của tôi (lớn nhất trong kích thước đầu ra, kích thước đầu vào và giá trị mã hóa cứng được sử dụng). Tôi không thấy các tệp giả như /dev/zero
được xử lý theo một cách đặc biệt: GNU GNU cũng sẽ chỉ sử dụng stat
trên các tệp đó.
stat(2)
.