介绍:libutil 库
libutil 是 Linux 操作系统上一些常用实用工具函数的集合,主要为与系统交互的底层功能提供支持。虽然这个库相对较小,并且功能有限,但它包含了一些在构建系统工具和终端仿真等应用时非常有用的函数。libutil 是 GNU C Library(glibc)的一部分,通常与 Linux 系统一起分发。
在 Linux 系统上,libutil 的共享库文件通常是 libutil.so.1,位于 /lib64/ 或 /usr/lib/ 等目录中。动态链接器在程序运行时根据需要加载这个库。
主要功能和常用函数
libutil 库的核心功能包括与伪终端、用户登录、进程管理等方面相关的一些辅助函数。以下是一些常用的函数:
1. openpty() 和 forkpty()
这两个函数是 libutil 中最常见和最有用的函数,用于操作 伪终端(pseudo terminal,简称 PTY)。伪终端是系统中虚拟的终端设备,用于终端仿真和进程间通信。
-
openpty():用于打开一个新的伪终端对。它返回一个主端和一个从端,这两个端口分别用于控制端和数据端。int openpty(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp);amaster: 返回的主端文件描述符。aslave: 返回的从端文件描述符。name: 伪终端的名称。termp: 伪终端的终端属性(可选)。winp: 伪终端的窗口大小(可选)。
-
forkpty():结合fork()和openpty(),创建一个新进程并为其关联一个伪终端。它可以简化需要创建子进程并与伪终端通信的场景。int forkpty(int *amaster, char *name, struct termios *termp, struct winsize *winp);使用场景:伪终端在终端仿真器、SSH、Telnet 以及其他终端会话应用中扮演着重要角色,
openpty()和forkpty()使得管理这些终端变得更加容易。
2. login_tty()
这个函数用于将进程的标准输入、输出和错误输出重定向到伪终端的从端,从而使进程像运行在一个物理终端上一样。
int login_tty(int fd);
fd: 伪终端的从端文件描述符。
login_tty() 通常与 forkpty() 一起使用,使子进程像在真正的终端设备中运行一样,这在创建仿真终端时非常有用。
3. logout() 和 logwtmp()
这些函数与用户登录/登出记录有关,用于管理和更新 utmp 和 wtmp 文件,这些文件分别记录当前登录用户的信息和登录历史。
-
logout():记录用户的登出事件。int logout(const char *utline); -
logwtmp():向wtmp文件添加一条登录或登出记录。void logwtmp(const char *line, const char *name, const char *host);
这些函数对于需要跟踪系统用户登录、登出事件的工具(如 who、last 命令)特别重要。
4. pidfile()(某些系统中可能存在)
pidfile() 用于创建一个文件,记录当前进程的 PID(进程 ID)。这在守护进程(daemon)中非常有用,以便其他程序可以通过这个文件找到进程的 PID。
int pidfile(const char *path);
path: PID 文件的路径。
该函数确保只有一个进程实例在运行,防止多个相同的守护进程实例启动。
使用场景
-
终端仿真:
libutil提供的伪终端操作函数在创建终端仿真器(如xterm或screen)中非常关键。这些工具通过forkpty()来创建与伪终端关联的子进程,使得它们能够模拟真实终端环境。 -
远程会话:SSH、Telnet 等远程登录协议也依赖伪终端操作。
libutil提供的功能帮助这些协议创建和管理终端会话。 -
守护进程:许多守护进程(例如
cron、sshd)使用libutil中的pidfile()函数来防止多个实例同时运行。 -
登录管理:记录和管理用户登录和登出事件的工具(如
login、logout命令)会使用libutil来更新utmp和wtmp文件中的记录。
如何在程序中使用 libutil
在 C/C++ 程序中,要使用 libutil 提供的功能,可以通过链接 libutil 库来实现。假设你有一个使用 openpty() 的简单程序,可以这样编译:
gcc -o myprogram myprogram.c -lutil
这里的 -lutil 用于链接 libutil 库。
总结
libutil 是一个功能简洁但十分实用的库,主要提供了与系统交互的底层工具函数。对于开发终端仿真器、守护进程以及用户登录管理等系统工具,libutil 提供了不可或缺的支持。它虽然没有复杂的功能,却通过简化伪终端操作和用户登录管理,为许多系统级应用提供了关键功能。