В примере из «Расширенное программирование в среде Unix» следующая программа-пример создает файл, а затем использует lseek для перемещения указателя файла на дополнительный адрес, таким образом, помещая «дыру» в файл.Автор говорит, что пространство между ними заполнено "0".Я хотел посмотреть, будут ли распечатаны эти "0".Поэтому я немного изменил программу.Однако я заметил, что в файл были записаны только допустимые символы.
Мой вопрос заключается в том, как менеджер файловой системы Unix / Linux может не печатать байты между ними?
#include "apue.h"
#include <fcntl.h>
#include <unistd.h>
char buf1[] = "abcdefghij";
char buf2[] = "ABCDEFGHIJ";
char buf3[10];
int
main(void)
{
int fd;
if ((fd = creat("file.hole", FILE_MODE)) < 0) {
err_sys("creat error");
}
if (write(fd, buf1, 10) != 10) { /* offset is now = 10 */
err_sys("buf1 write error");
}
if (lseek(fd, 16380, SEEK_SET) == -1) { /* offset now = 16380 */
err_sys("lseek error");
}
if (write(fd, buf2, 10) != 10) { /* offset now = 16390 */
err_sys("buf2 write error");
}
close(fd);
if ((fd = open("file.hole", O_RDWR)) == -1) {
err_sys("failed to re-open file");
}
ssize_t n;
ssize_t m;
while ((n = read(fd, buf3, 10)) > 0) {
if ((m = write(STDOUT_FILENO, buf3, 10)) != 10) {
err_sys("stdout write error");
}
}
if (n == -1) {
err_sys("buf3 read error");
}
exit(0);
}