如果我执行 cat /proc/asound/cards ,它会列出 proc 获取此信息的所有声卡详细信息。如果我想手动输入,此文件会不断更新
答案1
这是因为/proc
( 和/sys
) 是内核接口。磁盘上没有任何真实的文件。该信息直接来自操作系统。各个文件有点像套接字接口,当您读取它们时,您正在发出数据请求。
这进程文件系统显然起源于 UNIX 8(尽管 Linux 实现与大多数其他实现一样,是从贝尔实验室的 Plan 9 克隆而来),并且符合“一切都是文件”的 UNIX 格言。它主要代表各个正在运行的进程(顶级数字是 pid),但正如您所注意到的,也可以包含一些其他内容 - 这在 Linux 上与更多面向硬件的/sys
.
请注意,偶尔我会看到人们寻找“更好的替代方案”来以编程方式获取 proc 信息,其中“更好的替代方案”意味着系统调用,例如sysctl()
或ioctl()
。这似乎源于这样一种误解:读取 proc 或 sys 文件会像读取常规文件一样涉及一些 I/O 开销。事实并非如此,虽然某些操作系统(我认为是 FreeBSD)做了相反的事情,但在 Linux 上sysctl()
调用会被贬值:
从人2系统控制:
长期以来,人们一直不鼓励使用这个系统调用,而且它如此不受欢迎,以至于它很可能会在未来的内核版本中消失。立即将其从您的程序中删除;请改用 /proc/sys 接口。
现在您已经了解了:至少在 Linux 上,procfs 是官方推荐的内核信息源。没有“更好的选择”。
答案2
中的文件/proc
实际上并没有存储在任何地方;当您尝试读取它们时,内核会调用相应驱动程序中的函数来获取文件的内容。
在 的情况下/proc/asound/cards
,这最终会出现在函数处snd_card_info_read,它从 ALSA 的内部声卡列表生成其输出。
如果不实例化另一个声卡驱动程序,则无法添加另一个条目。