APUE: Создание файла с отверстием в нем: Рисунок 3.2 pg 65 - PullRequest
0 голосов
/ 20 декабря 2011

В примере из «Расширенное программирование в среде 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);
}

1 Ответ

3 голосов
/ 20 декабря 2011

Символ \000 имеет экранное представление нулевой ширины.Он напечатан, но его печать невидима.Не каждая кодовая точка является символом.Таким же образом, \n печатается как новая строка, а не как символ.

...