Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

size_t *n

Указатель на размер буфера. Если вы выделяете свой собственный буфер,

*n
должно содержать размер буфера. Обе функции обновляют
*n
новым значением размера буфера, если они его изменяют.

FILE* stream

Место, откуда следует получать входные символы.

По достижении конца файла или при ошибке функция возвращает -1. Строки содержат завершающий символ конца строки или разделитель (если он есть), а также завершающий нулевой байт. Использование

getline
просто, как показано в
ch03-getline.с
:

/* ch03-getline.c ---
демонстрация getline. */

#define _GNU_SOURCE 1

#include <stdio.h>

#include <sys/types.h>

/* main - прочесть строку и отобразить ее, пока не достигнут EOF */

int main(void) {

 char *line = NULL;

 size_t size = 0;

 ssize_t ret;

 while ((ret = getline(&line, &size, stdin)) != -1)

printf("(%lu) %s", size, line);

 return 0;

}

Вот эта функция в действии, показывающая размер буфера. Третья входная и выходная строки намеренно длинные, чтобы заставить

getline
увеличить размер буфера:

$ ch03-getline /* Запустить программу */

this is a line

(120) this is a line

And another line.

(120) And another line.

A llllllllllllllllloooooooooooooooooooooooooooooooonnnnnnnnnnnnnnnngnnnggggggggggg llliiiiiiiiiiiiiiiiiiinnnnnnnnnnnnnnnnnnnneeeeeeeeee

(240) A llllllllllllllllloooooooooooooooooooooooooooooooonnnnnnnnnnnnnnnngnnnggggggggggg llliiiiiiiiiiiiiiiiiiinnnnnnnnnnnnnnnnnnnneeeeeeeeee

3.2.2. Копирование строк:

strdup

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

strdup
:

#include <string.h>

/* strdup --- выделить память с malloc и скопировать строку */

char *strdup(const char *str) {

 size_t len;

 char *copy;

 len = strlen(str) + 1;

 /* включить место для завершающего '\0' */

 copy = malloc(len);

 if (copy != NULL) strcpy(copy, str);

 return copy; /* при ошибке возвращает NULL */

}

С появлением стандарта POSIX 2001 программисты по всему миру могут вздохнуть свободнее: эта функция является теперь частью POSIX в виде расширения XSI:

#include <string.h> /* XSI */

char *strdup(const char *str); /*
Копировать str */

Возвращаемое значение равно

NULL
, если была ошибка, или указатель на динамически выделенную память с копией
str
. Возвращенное значение должно быть освобождено с помощью
free
, когда больше не требуется.

3.2.3. Системные вызовы:

brk
и
sbrk

Четыре функции, которые мы рассмотрели (

malloc
,
calloc
,
realloc
и
free
) являются стандартными, переносимыми функциями для управления динамической памятью.

На Unix-системах стандартные функции реализованы поверх двух дополнительных, очень примитивных процедур, которые непосредственно изменяют размер адресного пространства процесса. Мы представляем их здесь, чтобы помочь вам понять, как работают GNU/Linux и Unix (снова «под капотом»); крайне маловероятно, что вам когда-нибудь понадобится использовать эти функции в обычных программах. Они определены следующим образом:

#include <unistd.h> /* Обычный */

#include <malloc.h> /* Необходим для систем GLIBC 2 */

int brk(void *end_data_segment);

void *sbrk(ptrdiff_t increment);

Системный вызов

brk
действительно изменяет адресное пространство процесса. Адрес является указателем, представляющим окончание сегмента данных (на самом деле, области кучи, как было показано ранее на рис. 3.1). Ее аргумент является абсолютным логическим адресом, представляющим новое окончание адресного пространства. В случае успеха функция возвращает 0, а в случае неуспеха (-1).

Функцию

sbrk
использовать проще; ее аргумент является числом байтов, на которое нужно увеличить адресное пространство. Вызвав ее с приращением 0, можно определить, где в настоящее время заканчивается адресное пространство. Таким образом, чтобы увеличить адресное пространство на 32 байта, используется код следующего вида:

char *p = (char*)sbrk(0); /* получить текущий конец адресного

пространства */

if (brk(p + 32) < 0) {

 /* обработать ошибку */

}

/* в противном случае, изменение сработало */

Практически, вам не нужно непосредственно использовать

brk
. Вместо этого используется исключительно
sbrk
для увеличения (или даже сокращения) адресного пространства. (Вскоре мы покажем, как это делать, в разделе 3.2.5. «Исследование адресного пространства».)

Еще более практично вообще никогда не использовать эти процедуры. Программа, которая их использует, не может затем использовать также и

malloc
, и это создает большую проблему, поскольку многие элементы стандартной библиотеки полагаются на использование
malloc
. Поэтому использование
brk
или
sbrk
может приводить к трудно обнаруживаемым крушениям программы.

Поделиться:
Популярные книги

Танцы с огнем

Робертс Нора
Любовные романы:
остросюжетные любовные романы
8.68
рейтинг книги
Танцы с огнем

Отморозок 4

Поповский Андрей Владимирович
4. Отморозок
Фантастика:
попаданцы
фантастика: прочее
5.00
рейтинг книги
Отморозок 4

Богатырские фамилии. Красные и белые (Сборники рассказов)

Алексеев Сергей Петрович
3. Собрание сочинений в трех томах
Проза:
историческая проза
5.25
рейтинг книги
Богатырские фамилии. Красные и белые (Сборники рассказов)

Второй шанс или Как стать Королем Пиратов

НекроХРЫЧ
Любовные романы:
любовно-фантастические романы
6.00
рейтинг книги
Второй шанс или Как стать Королем Пиратов

История героя: Огонь наших душ

Chepurnyy Yevhen
2. История героя
Фантастика:
фэнтези
уся
5.00
рейтинг книги
История героя: Огонь наших душ

Твори

Хвильовий Микола
Проза:
классическая проза
5.00
рейтинг книги
Твори

Методы статистического анализа исторических текстов (часть 2)

Фоменко Анатолий Тимофеевич
Научно-образовательная:
история
5.00
рейтинг книги
Методы статистического анализа исторических текстов (часть 2)

Конан Дойл

Чертанов Максим
1132. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Конан Дойл

Географ глобус пропил. Золото бунта

Иванов Алексей Викторович
Проза:
современная проза
7.86
рейтинг книги
Географ глобус пропил. Золото бунта

Римские фантазии (сборник)

Родари Джанни
Детские:
сказки
5.00
рейтинг книги
Римские фантазии (сборник)

Оружие пехоты 97

Федосеев Семен Леонидович
Справочная литература:
прочая справочная литература
5.00
рейтинг книги
Оружие пехоты 97

Пламенев. Книга IX

Карелин Сергей Витальевич
9. Пламенев
Фантастика:
аниме
уся
сказочная фантастика
фэнтези
фантастика: прочее
5.00
рейтинг книги
Пламенев. Книга IX

Дважды одаренный. Том IV

Тарс Элиан
4. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
7.29
рейтинг книги
Дважды одаренный. Том IV

Интернет-журнал "Домашняя лаборатория", 2008 №2

Журнал «Домашняя лаборатория»
Дом и Семья:
хобби и ремесла
сделай сам
5.00
рейтинг книги
Интернет-журнал Домашняя лаборатория, 2008 №2