Linux下API编程不像Windows一样,对每种设备和不同功能都有统一的API,所以有了《Windows核心编程》这种导论一类的大而全的书籍,整本书厚的像一块砖头。

Linux下贯彻了一贯的“一切皆文件”的宗旨,所以对于系统编程而言,整体API算是非常少了。网上有很多大佬做过很多分析总结,或者参考《Linux系统高级编程》,很快就能大概得到整体概览。
这里我提供一个网友做的在线Wiki作为参考:Linux API速查手册
| 函数 | 描述 |
|---|---|
| uname | 得到内核的名称和信息 |
| getpwuid | 通过uid获得相应的结构体passwd |
| getpwnam | 通过用户名获得相应的结构体passwd |
| getspnam | 通过用户名获得结构体spwd(内包含密码) |
| getgrgid | 通过gid获得相应的结构体group |
| getgrnam | 通过组名获得相应的结构体group |
| getenv | 获取系统环境变量的值 |
Linux下设备没有统一的API进行管理,但是Linux的设备驱动注册有统一的逻辑。如果是按照驱动标准编写的设备,根据Linux驱动原理,会在/dev/class/xxx对应位置产生设备文件描述符,通过这里就可以得到所有对应的类型的设备。
依据这个原理,我们就可以查看系统设备信息,然后遍历设备详细信息。
对于Video设备而言,当然可以通过基础API open等相关函数直接操作,但是太过低效和复杂,所以有了video for linux2 (v4l2)的软件内核驱动,通过它可以简单地操作视频设备。
参看 V4L2摄像头应用编程


Linux声音系统有些混乱,它有三套音频驱动: OSS (Open Sound System), 商业版的OSS,和ALSA (Advanced Linux Sound Architechture)。 所以底层驱动有OSS和ALSA两套API。
+----------+--------------+--------------------+---------+
|设备类型 | OSS | ALSA | 备注 |
+----------+--------------+--------------------+---------+
|声音采样 | /dev/dsp0 | /dev/snd/pcmC0D0 | |
+----------+--------------+--------------------+---------+
| 混音器 | /dev/mixer0 | /dev/snd/mixerC0D0 | 控制音量|
+----------+--------------+--------------------+---------+
|高层音序器| /dev/music0 | N/A | MIDI支持|
+----------+--------------+--------------------+---------+
|低层音序器| /dev/midi0 | N/A | MIDI支持|
+----------+--------------+--------------------+---------+
|声音状态 | /dev/sndstat| N/A | |
+----------+--------------+--------------------+---------+
|控制文件 | N/A | /dev/snd/controlC0 | |
+----------+--------------+--------------------+---------+
ALSA提供了和OSS不同的API,因此如果你使用ALSA做音频驱动, 一些通过OSS操作声音的程序将不能正常发声。
为了解决这一问题,ALSA提供了兼容OSS的库, 因此,如果你使用 ALSA 驱动声卡,也安装了兼容OSS的库, 那些使用OSS API的程序也能正常工作。
有一些应用程序直接和最底层的声音驱动(OSS_或_ALSA)打交道, 程序内部直接调用 OSS 或 ALSA 的API。
声音服务器介于应用程序和声卡驱动之间。 当不同的应用调用声音服务器的API来播放声音时,它们把音频数据送到服务器, 服务器将一个以上的播放请求混音后,再发送给底层的声卡驱动(ALSA_或_OSS)。 由_ALSA_或_OSS_来驱动声卡播放混音后的数据。 基于_ESD_开发音频程序的好处有:(1)简化开发。(2)即使底层驱动不支持多线程, 通过声音服务器也能实现多个应用程序同时发声。(3)有更好的音效。
除了声音服务器,为了简化开发,还出现了其它的一些声音库。 这些声音库有的和声音服务器打交道,有的直接和最底层的声音驱动(OSS_或_ALSA)打交道。 比如游戏程序使用的_SDL_库,就是直接和声音驱动打交道。
所以,audio比video更混乱,一般使用ALSA框架处理,或者更高阶的PulseAudio进行。
ALSA Layer比较复杂,功能不足,推出了ASoC
PipeWire 是未来的大统一方案,但是还是太新了。
总结: 在乎性能和功能,直接选择ALSA, 否则可以尝试PulseAudio/PipeWire。
Linux下USB也没有HIDAPI一类的库,目前也没有官方一点的标准框架,只有libusb这个跨平台的第三方库。
参看: