Linux программирование в примерах
Linux программирование в примерах читать книгу онлайн
В книге рассмотрены вопросы, связанные с программированием под Linux: файловый ввод/вывод, метаданные файлов, основы управления памятью, процессы и сигналы, пользователи и группы, вопросы интернационализации и локализации, сортировка, поиск и многие другие. Много внимания уделено средствам отладки, доступным под GNU Linux. Все темы иллюстрируются примерами кода, взятого из V7 UNIX и GNU. Эта книга может быть полезна любому, кто интересуется программированием под Linux.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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()
Функцию
sbrk()
char *p = (char*)sbrk(0); /* получить текущий конец адресного
пространства */
if (brk(p + 32) < 0) {
/* обработать ошибку */
}
/* в противном случае, изменение сработало */
Практически, вам не нужно непосредственно использовать
brk()
sbrk()
Еще более практично вообще никогда не использовать эти процедуры. Программа, которая их использует, не может затем использовать также и
malloc()
malloc()
brk()
sbrk()
Но знать о низкоуровневых механизмах стоит, и конечно же, набор функций
malloc()
sbrk()
brk()
3.2.4. Вызовы ленивых программистов:
alloca()
«Опасность, Билл Робинсон! Опасность!»
Есть еще одна дополнительная функция выделения памяти, о которой вам нужно знать. Мы обсуждаем ее лишь для того, чтобы вы поняли ее, когда увидите, но не следует использовать ее в новых программах! Эта функция называется
alloca()
/* Заголовок в GNU/Linux, возможно, не на всех Unix-системах */
#include <alloca.h> /* Обычный */
void *alloca(size_t size);
Функция
alloca()
size
На первый взгляд,
alloca()
• Функция не является стандартной; она не включена ни в какой стандарт, ни в ISO, ни в С или POSIX.
• Функция не переносима. Хотя она существует на многих системах Unix и GNU/Linux, она не существует на не-Unix системах. Это проблема, поскольку код часто должен быть многоплатформенным, выходя за пределы просто Linux и Unix.
• На некоторых системах
alloca()
• Цитируя справку [45] (добавлено выделение): «Функция
alloca
• Снова цитируя справку: «На многих системах
alloca
alloca
• Она потворствует неряшливому программированию. Тщательная и корректная работа с памятью не сложна; вам просто нужно подумать о том, что вы делаете, и планировать заранее.
GCC обычно использует встроенную версию функции, которая действует с использованием внутритекстового (inline) кода. В результате есть другие последствия
alloca()
Факт, что код является внутритекстовым (inline), означает, что невозможно получить адрес этой функции или изменить ее поведение путем компоновки с другой библиотекой.
Внутритекстовый код часто состоит из одной инструкции, подгоняющей указатель стека, и не проверяет переполнение стека. Поэтому нет возврата
NULL