总论
Linux下API编程不像Windows一样,对每种设备和不同功能都有统一的API,所以有了《Windows核心编程》这种导论一类的大而全的书籍,整本书厚的像一块砖头。
Linux下贯彻了一贯的“一切皆文件”的宗旨,所以对于系统编程而言,整体API算是非常少了。网上有很多大佬做过很多分析总结,或者参考《Linux系统高级编程》,很快就能大概得到整体概览。
这里我提供一个网友做的在线Wiki作为参考:Linux API速查手册
Linux基础API
文件
文件I O
-
基于文件描述符
-
open
-
read
-
write
-
lseek
-
fcntl
-
dup
-
基于数据流 ANSI C
fopen | fclose |
---|---|
fwrite | fread |
fputc | fgetc |
fputs | fgets |
feof | ferror |
fseek | rewind |
ftell |
文件与目录
-
文件操作
-
chown
-
rename
-
stat
-
dirname
-
basename
-
目录操作
-
getcwd
IPC 进程间通信
1. 管道
pipe | mkfifo |
---|
2. 信号处理
- 信号类型
- psignal
- kill
- raise
- signal
- sigaction
- 信号阻塞
- sigsuspend
- sigalstack
3.1 IPC对象 System V
消息队列 | 信号量 | 共享内存 |
---|---|---|
msgget | semget | shmget |
msgctl | semctl | shmctl |
msgsnd | semop | shmat |
msgrcv | shmdt |
3.2 IPC对象 POSIX
- 消息队列
- 信号量
- 共享内存
4. 网络编程
套接字结构 | 套接字函数 |
---|---|
字节序转换 | 地址转换 |
主机 | 服务 |
- 带外数据
- sockatmark
并发编程
1. 进程控制
fork | vfork |
---|---|
exec~ | system |
wait | waitpid |
2. 多线程
-
基本编程
-
pthread_create
-
pthread_exit
-
pthread_join
-
线程同步
-
互斥锁
-
条件变量
-
读写锁
-
线程信号
-
POSIX信号量
3. IO多路复用
- select BSD
- poll System V
- epoll模型
- epoll_create
- epoll_ctl
- epoll_wait
4. 异步IO(AIO)
其他
时间与定时
ANSI C | POSIX |
---|---|
time | gettimeofday |
difftime | getitimer |
localtime | |
ctime |
系统管理
函数 | 描述 |
---|---|
uname | 得到内核的名称和信息 |
getpwuid | 通过uid获得相应的结构体passwd |
getpwnam | 通过用户名获得相应的结构体passwd |
getspnam | 通过用户名获得结构体spwd(内包含密码) |
getgrgid | 通过gid获得相应的结构体group |
getgrnam | 通过组名获得相应的结构体group |
getenv | 获取系统环境变量的值 |
命令行
- getopt
Linux Video
Linux下设备没有统一的API进行管理,但是Linux的设备驱动注册有统一的逻辑。如果是按照驱动标准编写的设备,根据Linux驱动原理,会在/dev/class/xxx
对应位置产生设备文件描述符,通过这里就可以得到所有对应的类型的设备。
依据这个原理,我们就可以查看系统设备信息,然后遍历设备详细信息。
对于Video设备而言,当然可以通过基础API open等相关函数直接操作,但是太过低效和复杂,所以有了video for linux2 (v4l2)
的软件内核驱动,通过它可以简单地操作视频设备。
参看 V4L2摄像头应用编程
Linux Audio API
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的程序也能正常工作。
Linux 音频开发之入门篇
应用程序和声卡驱动的交互方式
直接和底层声音驱动打交道
有一些应用程序直接和最底层的声音驱动(OSS_或_ALSA)打交道, 程序内部直接调用 OSS 或 ALSA 的API。
通过声音服务器
声音服务器介于应用程序和声卡驱动之间。 当不同的应用调用声音服务器的API来播放声音时,它们把音频数据送到服务器, 服务器将一个以上的播放请求混音后,再发送给底层的声卡驱动(ALSA_或_OSS)。 由_ALSA_或_OSS_来驱动声卡播放混音后的数据。 基于_ESD_开发音频程序的好处有:(1)简化开发。(2)即使底层驱动不支持多线程, 通过声音服务器也能实现多个应用程序同时发声。(3)有更好的音效。
- ESD
ESD 一直是 Gnome 桌面环境的声音服务器, Gnome 应用多是通过 ESD 处理声音的。 - aRts
和 ESD 对应,aRts 是 KDE 桌面环境的声音服务器, 底层通过 ALSA 驱动声卡。KDE 应用多通过 aRts 处理声音。 - PulseAudio
PulseAudio_是新一代声音服务器,能提供更好的音效, 已经有越来越多的应用通过_PulseAudio_处理声音。 为了让使用_ESD_的程序能继续在_PulseAudio 上工作, PulseAudio 提供了 ESD 的兼容层。 Gnome 未来将采用_PulseAudio_取代_ESD_。
通过其它库
除了声音服务器,为了简化开发,还出现了其它的一些声音库。 这些声音库有的和声音服务器打交道,有的直接和最底层的声音驱动(OSS_或_ALSA)打交道。 比如游戏程序使用的_SDL_库,就是直接和声音驱动打交道。
所以,audio比video更混乱,一般使用ALSA框架处理,或者更高阶的PulseAudio进行。
ALSA Layer比较复杂,功能不足,推出了ASoC
PipeWire 是未来的大统一方案,但是还是太新了。
总结: 在乎性能和功能,直接选择ALSA
, 否则可以尝试PulseAudio/PipeWire
。
Linux USB API
Linux下USB也没有HIDAPI一类的库,目前也没有官方一点的标准框架,只有libusb
这个跨平台的第三方库。
参看:
- https://blog.csdn.net/whstudio123/article/details/104348736
- https://www.kernel.org/doc/html/latest/driver-api/usb/usb.html#introduction-to-usb-on-linux
- https://blog.csdn.net/qq_27149449/article/details/119704387