LibKing » Книги » comp-programming » Марк Митчелл - Программирование для Linux. Профессиональный подход

Марк Митчелл - Программирование для Linux. Профессиональный подход

Тут можно читать онлайн Марк Митчелл - Программирование для Linux. Профессиональный подход - бесплатно полную версию книги (целиком). Жанр: comp-programming, издательство Вильямс, год 2002. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте LibKing.Ru (ЛибКинг) или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Марк Митчелл - Программирование для Linux. Профессиональный подход
  • Название:
    Программирование для Linux. Профессиональный подход
  • Автор:
  • Жанр:
  • Издательство:
    Вильямс
  • Год:
    2002
  • ISBN:
    5-8459-0243-6
  • Рейтинг:
    3.6/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Ваша оценка:

Марк Митчелл - Программирование для Linux. Профессиональный подход краткое содержание

Программирование для Linux. Профессиональный подход - описание и краткое содержание, автор Марк Митчелл, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Данная книга в основном посвящена программированию в среде GNU/Linux. Авторы применяют обучающий подход, последовательно излагая самые важные концепции и методики использования расширенных возможностей системы GNU/Linux в прикладных программах. Читатели научатся писать программы, к интерфейсу которых привыкли пользователи Linux; освоят такие технологии, как многозадачность, многопотоковое программирование, межзадачное взаимодействие и взаимодействие с аппаратными устройствами; смогут улучшить свои программы, сделав их быстрее, надежнее и безопаснее; поймут особенности системы GNU/Linux, ее ограничения, дополнительные возможности и специфические соглашения.

Книга предназначена для программистов, уже знакомых с языком С и имеющих базовый опыт работы в GNU/Linux.

Программирование для Linux. Профессиональный подход - читать онлайн бесплатно полную версию (весь текст целиком)

Программирование для Linux. Профессиональный подход - читать книгу онлайн бесплатно, автор Марк Митчелл
Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать

Если программа читает текстовые файлы, сгенерированные Windows-программами, желательно менять последовательность '\r\n'одним символом новой строки. Точно так же при записи текстовых файлов, которые будут читаться Windows-программами, нужно менять одиночные символы новой строки комбинациями '\r\n'.

В листинге Б.4 демонстрируется применение функции read(). Программа отображает шестнадцатиричный дамп файла, заданного в командной строке. В каждой строке показано смещение от начала файла, а затем — следующие 16 байтов.

Листинг Б.4. ( hexdump.c ) Отображение шестнадцатеричного дампа файла

#include

#include

#include

#include

#include

int main(int argc, char* argv[]) {

unsigned char buffer[16];

size_t offset = 0;

size_t bytes_read;

int i;

/* Открытие файла для чтения. */

int fd = open(argv[1], O_RDONLY);

/* Чтение данных из файла по одному блоку за раз. Чтение

продолжается до тех пор, пока размер очередной порции байтов

не окажется меньше размера буфера. Это свидетельствует

о достижении конца буфера. */

do {

/* чтение следующей строки байтов. */

bytes_read = read(fd, buffer, sizeof(buffer));

/* Отображение смещения, а затем самих байтов. */

printf("0x%06x : ", offset);

for (i = 0; i < bytes_read; ++i)

printf("%02x ", buffer[i]);

printf("\n");

/* Вычисление позиции в файле. */

offset += bytes_read;

}

while (bytes_read == sizeof(buffer));

/* Конец работы. */

close(fd);

return 0;

}

Ниже показаны результаты работы программы. Она выводит дамп самой себя.

% ./hexdump hexdump

0x000000 : 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00

0x000010 : 02 00 03 00 01 00 00 00 c0 B3 04 0B 34 00 00 00

0x000020 : e8 23 00 00 00 00 00 00 34 00 20 00 06 00 28 00

0x000030 : 1d 00 1a 00 06 00 00 00 34 00 00 00 34 80 04 08

...

Эти результаты могут быть разными в зависимости от того, какой компилятор применялся и какие флаги компиляции были установлены.

Б.1.5. Перемещение по файлу

В файловом дескрипторе запоминается текущая позиция в файле. При чтении или записи данных указатель текущей позиции перемещается на то количество байтов, которое было прочитано или записано. Но иногда нужно осуществлять простое перемещение по файлу (позиционирование). Например, может потребоваться вернуться в начало файла и прочитать его заново, не открывая повторно.

Позиционирование указателя текущей позиции файла осуществляет функция lseek(). Она принимает дескриптор файла и два дополнительных аргумента, определяющих новую позицию указателя.

■ Если третий аргумент равен SEEK_SET, функция lseek()интерпретирует второй аргумент как смещение (в байтах) от начала файла.

■ Если третий аргумент равен SEEK_CUR, функция lseek()интерпретирует второй аргумент как смещение (положительное или отрицательное) от текущей позиции.

■ Если третий аргумент равен SEEK_END, функция lseek()интерпретирует второй аргумент как смещение (в байтах) от конца файла.

Функция lseek()возвращает смещение новой позиции от начала файла. Тип этого значения — off_t. В случае ошибки возвращается -1. Функция неприменима к файлам некоторых типов, например к сокетам.

Если требуется узнать текущую позицию файла, задайте смещение 0:

off_t position = lseek(free_descriptor, 0, SEEK_CUR);

ОС Linux позволяет перемещать указатель текущей позиции за пределы файла. Обычно, если текущая позиция находится за концом файла и выполняется операция записи, операционная система автоматически увеличивает файл, чтобы вместить в него новые данные. "Промежуток" между старым признаком конца файла и указателем текущей позиции не записывается на диск. Linux лишь помечает его длину. Если впоследствии попытаться прочесть файл, окажется, что данный промежуток заполнен нулевыми байтами.

Благодаря данной особенности функции lseek()можно создавать файлы огромного размера, практически не занимающие места на диске. Это продемонстрировано в листинге Б.5. В качестве аргументов командной строки программа принимает имя файла и требуемый размер в мегабайтах. Программа создает файл, перемещается с помощью функции lseek()на нужное расстояние и записывает нулевой байт, после чего закрывает файл.

Листинг Б.5. ( lseek-huge.c ) Создание огромных файлов с помощью функции lseek()

#include

#include

#include

#include

#include

int main (int argc, char* argv[]) {

int zero = 0;

const int megabyte = 1024 * 1024;

char* filename = argv[1];

size_t length = (size_t)atoi(argv[2]) * megabyte;

/* Создание нового файла. */

int fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0666);

/* Перемещение в точку, где должен быть записан последний байт

файла. */

lseek(fd, length - 1, SEEK_SET);

/* Запись нулевого байта. */

write(fd, &zero, 1);

/* Конец работы. */

close(fd);

return 0;

}

Давайте теперь создадим файл размером 1 Гбайт. Обратите внимание на объем свободного места на диске до и после выполнения программы.

% df -h .

Filesystem Size Used Avail Use% Mounted on

/dev/hda5 2.9G 2.1G 655M 76% /

% ./lseek-huge bigfile 1024 % ls -l bigfile

-rw-r----- 1 samuel samuel 1073741824 Feb 5 16:29 bigfile

% df -h .

Filesystem Size Used Avail Use% Mounted on

/dev/hda5 2.9G 2.1G 655M 76% /

Как видите, файл практически не занимает место на диске, несмотря на свой огромный размер. Но если открыть его и попытаться прочитать данные, окажется, что в нем находится 1 Гбайт нулей. Давайте, к примеру, проверим это с помощью программы hexdump:

% ./hexdump bigfile / head -10

0x000000 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0x000010 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0x000020 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0x000030 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0x000040 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

0x000050 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

...

Чтобы не наблюдать, как по экрану проносятся 2 30нулей, нажмите .

"Волшебные промежутки" в файлах являются особенностью файловых систем типа ext2, обычно создаваемых на жестких дисках Linux. Если попытаться с помощью программы lseek-hugeсоздать файл в файловой системе типа fatили vfat, то он займет весь указанный объем диска.

ОС Linux не позволяет функции lseek()ставить указатель текущей позиции перед началом файла.

Б.2. Функция stat()

Функция read()позволяет прочесть только содержимое файла. Но как насчет остальной информации? Например, команда ls -lсообщает такие сведения о файлах в текущем каталоге, как размер, время последнего обновления, права доступа, владелец и пр. Аналогичную информацию об отдельном файле можно получить с помощью функции stat(). Ей необходимо передать путевое имя файла и указатель на структуру типа stat. В случае успешного завершения функция возвращает 0 и заполняет поля структуры данными о файле, иначе возвращается -1.

Читать дальше
Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать


Марк Митчелл читать все книги автора по порядку

Марк Митчелл - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Программирование для Linux. Профессиональный подход отзывы


Отзывы читателей о книге Программирование для Linux. Профессиональный подход, автор: Марк Митчелл. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
Большинство книг на сайте опубликовано легально на правах партнёрской программы ЛитРес. Если Ваша книга была опубликована с нарушениями авторских прав, пожалуйста, направьте Вашу жалобу на PGEgaHJlZj0ibWFpbHRvOmFidXNlQGxpYmtpbmcucnUiIHJlbD0ibm9mb2xsb3ciPmFidXNlQGxpYmtpbmcucnU8L2E+ или заполните форму обратной связи.
img img img img img