子例程、示例程序和库

本主题提供了关于什么是子例程、如何使用它们以及它们存储在何处的信息。

子例程通过存储在库中来节约存储空间,并且使程序链接过程更有效率。 是一个数据文件,包含了许多单独文件的副本以及使这些文件被单独访问的控制信息。 这些库在 /usr/ccs/lib/usr/lib 目录中。 按照约定,大多数这种文件的名称使用 libname.a 的形式,其中 name 表示特定的库。

所有的包含语句应在要编译的第一个文件的开头附近,通常在 main( ) 之前的声明部分,且必须在使用任何库函数前出现。 例如,使用以下语句来包含 stdio.h 文件:

#include <stdio.h>

在使用标准 C 库 (libc.a) 中的子例程时,您无需执行任何特殊操作。 cc 命令会自动在该库中搜索程序需要的子例程。 但是,如果您使用的是另一个库的子例程,那么必须告知编译器对该库进行搜索。 如果您的程序使用的是库 libname.a 的子例程,请使用 -lname(小写 L)标记对程序进行编译。 以下示例编译程序myprog.c,它使用 libdbm.a 库中的子例程:

cc myprog.c -ldbm

您可以指定多个 -l(小写 L)标记。 每个标记将按指定的顺序处理。

如果您正在使用存储在 Berkeley 兼容性库中的子例程,请绑定到 libbsd.a 绑定到 libc.a 库,如以下示例中所示:

cc myprog.c -lbsd

当有错误发生时,许多子例程将返回值 -1,并设置一个名为 errno 的外部变量以标识该错误。 sys/errno.h 文件声明了变量 errno,并为每个可能的错误情况定义了一个常量。

在本文档中,所有的系统调用都描述为子例程,并且都是从 libc.a 库中解析出来的。 系统调用的编程接口与子例程调用的编程接口相同。 对 C 语言程序而言,系统调用就是子例程调用。 系统调用和子例程调用的真正不同之处在于两者所执行的操作类型。 当程序执行系统调用时,会发生保护域切换,这样被调用的例程可以访问操作系统内核的特权信息。 然后例程将代表程序以内核方式执行任务。 在这种方式下,对特权系统信息的访问仅限于预定义的一组例程,这些例程的操作是可以控制的。

注意:
  1. 以下列表列示了对于 64 位 libc.a 已过时的 wString 例程。 它们相应的 64 位 libc.a 等价例程也包括在内。 32 位 libc.a 的例程可以在 wstring 子例程中找到。
    32 Bit only                 64 Bit Equivalent
    
    wstrcat                     wcscat
    wstrchr                     wcschr
    wstrcmp                     wcscoll
    wstrcpy                     wcscpy
    wstrcspn                    wcscspn
    wstrdup                     Not available and has no
                                equivalents in the 64 bit libc.a
    wstrlen                     wcslen
    wstrncat                    wcsncat
    wstrncpy                    wcsncpy
    wstrpbrk                    wcspbrk
    wstrrchr                    wcsrchr
    wstrspn                     wcsspn
    wstrtok                     wcstok
  2. 所有处理多字节字符,宽字符或特定于语言环境的信息的程序必须在程序开头调用 setlocale 子例程。
  3. 在多线程环境中编程需要重入子例程以确保数据完整性。