编写设备驱动程序

设备用户命令接口

fuser(1M) 命令已得到增强,可以显示设备使用信息。仅当 path 表示设备次要节点时,fuser(1M) 命令才会显示设备使用信息。仅当指定了表示设备次要节点的 path 时,在 fuser(1M) 命令中使用 -d 标志才会有效。

fuser path

显示有关应用程序设备使用方和内核设备使用方的信息(如果 path 表示设备次要节点)。

fuser -d path

显示与 path 表示的设备次要节点关联的基础设备的所有用户。

报告内核设备使用方时采用以下四种格式之一。内核设备使用方始终用方括号 ([]) 括起来。


        [kernel_module_name]
        [kernel_module_name,dev_path=path]
        [kernel_module_name,dev=(major,minor)]
        [kernel_module_name,dev=(major,minor),dev_path=path]

如果 fuser(1M) 命令显示的是文件或设备用户,则输出由 stdout 中的进程 ID 后跟 stderr 中的字符组成。stderr 中的字符描述如何使用文件或设备。stderr 中会显示所有内核使用方信息。而 stdout 中不会显示任何内核使用方信息。

如果不使用 -d 标志,则 fuser(1M) 命令仅报告由 path 指定的设备次要节点的使用方。如果使用 -d 标志,则 fuser(1M) 命令会报告由 path 指定的次要节点的基础设备节点的使用方。以下示例说明了这两种情况下报告输出的差别。


示例 14–11 基础设备节点的使用方

大多数网络设备在打开时都会克隆其次要节点。如果请求克隆次要节点的设备使用信息,则该使用信息可能会表明没有任何进程在使用该设备。而如果请求基础设备节点的设备使用信息,则该使用信息可能会表明某个进程正在使用该设备。在本示例中,如果仅将设备 path 传递到 fuser(1M) 命令,则不会报告任何设备使用方。如果使用 -d 标志,则输出表明正在采用 udpudp6 \uc2\u26469 来访问该设备。


% fuser /dev/iprb0
/dev/iprb0:
% fuser -d /dev/iprb0
/dev/iprb0:  [udp,dev_path=/pseudo/udp@0] [udp6,dev_path=/pseudo/udp6@0]

请将本示例的输出与示例 14–10 的输出进行比较。



示例 14–12 键盘设备的使用方

在本示例中,某个内核使用方正在访问 /dev/kbd。正在访问 /dev/kbd 设备的内核使用方是工作站控制台驱动程序。


% fuser -d /dev/kbd
/dev/kbd:  [genunix] [wc,dev_path=/pseudo/wc@0]

请将本示例的输出与示例 14–9 的输出进行比较。