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. Профессиональный подход - читать книгу онлайн бесплатно, автор Марк Митчелл
Тёмная тема

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать

Перечислим наиболее полезные поля структуры stat.

■ В поле st_modeсодержится код доступа к файлу. О правах доступа к файлам рассказывалось в разделе 10.3. "Права доступа к файлам". В старшем бите поля закодирован тип файла. Об этом пойдет речь ниже.

■ В полях st_uidи st_gidсодержатся идентификаторы соответственно пользователя и группы, которым принадлежит файл. Назначение идентификатора описывалось в разделе 10.1, "Пользователи и группы".

■ В поле st_sizeхранится размер файла в байтах.

■ В поле st_atimeзаписано время последнего обращения к файлу (для чтения или записи).

■ В поле st_mtimeзаписано время последней модификации файла.

Следующие макросы проверяют поле st_mode, чтобы определить, для файла какого типа была вызвана функция stat. Макросы возвращают ненулевое значение, если их догадка о типе файла подтвердилась.

S_ISBLK( код доступа )— блочное устройство:

S_ISCHR( код доступа )— символьное устройство;

S_ISDIR( код доступа )— каталог;

S_ISFIFO( код доступа )— FIFO-файл (именованный канал):

S_ISLNK( код доступа )— символическая ссылка.

S_ISREG( код доступа )— обычный файл;

S_ISSOCK( код доступа )— сокет.

В поле st_devсодержатся старший и младший номера аппаратного устройства, в котором расположен файл (о номерах устройств рассказывалось в главе 6, "Устройства"). Старший номер находится в старшем байте поля, а младший — в младшем. В поле st_infосодержится номер индексного дескриптора файла, определяющий местоположение файла в файловой системе.

Если вызвать функцию stat()для символической ссылки, функция проследит, куда указывает ссылка, и вернет информацию о том файле, а не о самой ссылке. Таким образом, в случае функции stat()макрос S_ISLNK()всегда будет возвращать значение 0. Есть другая функция, lstat(), которая не пытается отслеживать символические ссылки. Во всем остальном она эквивалентна функции stat(). Если вызвать функцию stat()для поврежденной ссылки (которая указывает на несуществующий или недоступный файл), возникнет ошибка, тогда как функция lstat()в подобной ситуации выполнится успешно.

Если файл уже открыт для чтения или записи, лучше пользоваться функцией fstat(). В качестве первого аргумента она принимает не путевое имя, а дескриптор.

В листинге Б.6 показана функция которая создает буфер достаточного размера и загружает в него содержимое указанного файла. Размер файла определяется с помощью функции fstat(). Она же позволяет проверить, соответствует ли заданное имя обычному файлу.

Листинг Б.6. ( read-file.c ) Загрузка файла в буфер

#include

#include

#include

#include

#include

/* Загрузка содержимого файла FILENAME в память.

Размер буфера записывается в аргумент LENGTH.

Создаваемый буфер должен удаляться в вызывающей функции.

Если аргумент FILENAME не соответствует обычному файлу,

возвращается NULL. */

char* read_file(const char* filename, size_t* length) {

int fd;

struct stat file_info;

char* buffer;

/* Открытие файла. */

fd = open(filename, O_RDONLY);

/* Получение информации о файле. */

fstat(fd, &file_info);

*length = file_info.st_size;

/* Проверка того, что это обычный файл. */

if (!S_ISREG(file_info.st_mode)) {

/* Этот тип файла не поддерживается. */

close(fd);

return NULL;

}

/* выделение буфера достаточного размера. */

buffer = (char*)malloc(*length);

/* Загрузка файла в буфер. */

read(fd, buffer, *length);

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

close(fd);

return buffer;

}

Б.3. Векторные чтение и запись

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

Функция writev()позволяет записать в файл несколько несвязанных буферов одновременно. Это называется векторной записью . Сложность применения функции writev()заключается в создании структуры, задающей начало и конец каждого буфера. Эта структура представляет собой массив элементов типа struct iovec. Каждый элемент описывает одну область памяти. В поле iov_baseуказывается адрес начала области, а в поле iov_len— ее длина. Если число буферов известно заранее, можно просто объявить массив типа struct iovec. В противном случае придется выделять массив динамически.

Функции writev()передается дескриптор записываемого файла, массив структур iovec и размер массива. Функция возвращает общее число записанных байтов.

Программа, показанная в листинге Б.7, записывает свои аргументы командной строки в файл с помощью одной-единственной функции writev(). Первый аргумент — это имя файла, в котором сохраняются все последующие аргументы, каждый в отдельной строке. Число элементов в массиве структур iovecв два раза превышает число аргументов командной строки, так как после каждого аргумента записывается символ новой строки. Поскольку количество аргументов неизвестно заранее, массив создается с помощью функции malloc().

Листинг Б.7. ( write-args.c ) Запись списка аргументов в файл с помощью функции writev()

#include

#include

#include

#include

#include

#include

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

int fd;

struct iovec* vec;

struct iovec* vec_next;

int i;

/* Символ новой строки хранится в обычной переменной

типа char. */

char newline = '\n';

/* Первый аргумент командной строки -- это имя выходного

файла. */

char* filename = argv[1];

/* Пропускаем первые два элемента списка аргументов.

Элемент номер 0 -- это имя самой программы,

а элемент номер 1 -- это имя выходного файла */

argc -= 2;

argv += 2;

/* Выделяем массив элементов типа iovec каждому аргументу

командной строки соответствует два элемента массива:

один -- для самого аргумента,

а другой -- для символа новой строки. */

vec =

(struct iovec*)malloc(2 * argc * sizeof(struct iovec));

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

Шрифт:

Сбросить

Интервал:

Закладка:

Сделать


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

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




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


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


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

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