Функции, примеры программ и библиотеки

В данном разделе объясняется, что такое функции, как их использовать, и где они хранятся.

Для экономии памяти и более эффективной компоновки программ функции хранятся в виде библиотек. Библиотека - это файл данных, содержащий копии отдельных файлов и управляющую информацию, которая позволяет получать доступ к отдельным файлам. Библиотеки располагаются в каталогах /usr/ccs/lib и /usr/lib. По общепринятому соглашению имена большинства из них задаются в виде libимя.a, где имя задает конкретную библиотеку.

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

#include <stdio.h>

Для вызова стандартных функций языка C из библиотеки libc.a не нужно выполнять никаких специальных действий. Команда cc автоматически находит эту библиотеку для функций, вызываемых в данной программе. Однако если вы вызываете функцию из другой библиотеки, необходимо сообщить компилятору имя этой библиотеки. Если в вашей программе используются функции из библиотеки libимя.a, то компилируйте программу с флагом -lимя (L в нижнем регистре). Для компиляции программы myprog.c, в которой используются функции из библиотеки libdbm.a необходимо ввести команду

cc myprog.c -ldbm

Можно задать несколько флагов -l (L в нижнем регистре). Флаги обрабатываются в том порядке, в котором указаны.

Если вы планируете использовать функцию из библиотеки Berkeley Compatibility Library, то необходимо сначала подключить библиотеку libbsd.a, и только потом - библиотеку libc.a, как показано в следующем примере:

cc myprog.c -lbsd

При возникновении ошибки большинство функций возвращают значение -1 и записывают код ошибки во внешнюю переменную errno. Переменная errno объявляется в файле sys/errno.h, кроме того, в этом файле определяются константы для всех возможных исключительных ситуаций.

В данном руководстве все системные вызовы описываются как функции; предполагается, что они хранятся в библиотеке libc.a. Программный интерфейс системных вызовов аналогичен интерфейсу функций. В программах на языке С системный вызов - это просто вызов функции. Реальное различие между системным вызовом и функцией заключается в типе выполняемой ими операции. Когда программа выполняет системный вызов, переключается режим защиты домена, и вызываемая процедура получает доступ к специальной информации ядра операционной системы. При этом процедура работает в режиме ядра и выполняет задачу вместо программы. Таким образом, доступ к специальной системной информации разрешен ограниченному набору предопределенных процедур, действиями которых можно управлять.

Прим.:
  1. Ниже приведен список устаревших функций wString 64-разрядной библиотеки libc.a. Здесь же приводятся соответствующие функции 64-разрядной библиотеки libc.a. Список функций 32-разрядной библиотеки libc.a приведен в описании функции wstring.
    32-разрядная  64-разрядная 
    
    wstrcat wcscat
    wstrchr wcschr
    wstrcmp wcscoll
    wstrcpy wcscpy
    wstrcspn wcscspn
    wstrdup                     Недоступна и не имеет аналогов
                                в 64-разрядной libc.a
    wstrlen wcslen
    wstrncat wcsncat
    wstrncpy wcsncpy
    wstrpbrk wcspbrk
    wstrrchr wcsrchr
    wstrspn wcsspn
    wstrtok wcstok
  2. В начале любой программы, работающей с многобайтовыми, широкими или определяемыми локалью символами, должна вызываться функция setlocale.
  3. Для того чтобы обеспечить целостность данных, при создании программ с несколькими нитями следует применять реентерабельные функции.