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

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

Жанры

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
может приводить к трудно обнаруживаемым крушениям программы.

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

Кодекс Охотника. Книга ХХХ

Винокуров Юрий
30. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга ХХХ

Прайм. День Платы

Бор Жорж
7. Легенда
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Прайм. День Платы

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

Муссон

Смит Уилбур
10. Кортни
Приключения:
исторические приключения
морские приключения
8.30
рейтинг книги
Муссон

Сочинения

Брюсов Валерий Яковлевич
Проза:
русская классическая проза
5.00
рейтинг книги
Сочинения

Город гибели

МакКаммон Роберт Рик
Фантастика:
ужасы и мистика
мистика
7.78
рейтинг книги
Город гибели

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Бернард Шоу

Пирсон Хескет
След в истории
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Бернард Шоу

Гоголь

Степанов Николай Леонидович
324. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Гоголь

Русские дети (сборник)

Фрай Макс
Проза:
современная проза
5.60
рейтинг книги
Русские дети (сборник)

AutoCAD 2008. Руководство пользователя

Autodesk
Справочная литература:
руководства
5.00
рейтинг книги
AutoCAD 2008. Руководство пользователя

Ермак

Федоров Евгений Александрович
Проза:
историческая проза
6.25
рейтинг книги
Ермак

Собрание сочинений Джерома Клапки Джерома в одной книге

Джером Клапка Джером
7. Абсолют
Проза:
классическая проза
5.00
рейтинг книги
Собрание сочинений Джерома Клапки Джерома в одной книге

Ведьмак (сборник)

Сапковский Анджей
Фантастика:
фэнтези
6.67
рейтинг книги
Ведьмак (сборник)