Linux_API_系列-整体概览

news/2024/11/29 12:01:12/

总论

Linux下API编程不像Windows一样,对每种设备和不同功能都有统一的API,所以有了《Windows核心编程》这种导论一类的大而全的书籍,整本书厚的像一块砖头。
在这里插入图片描述
Linux下贯彻了一贯的“一切皆文件”的宗旨,所以对于系统编程而言,整体API算是非常少了。网上有很多大佬做过很多分析总结,或者参考《Linux系统高级编程》,很快就能大概得到整体概览。

这里我提供一个网友做的在线Wiki作为参考:Linux API速查手册

Linux基础API

文件

文件I O

  • 基于文件描述符

  • open

  • read

  • write

  • lseek

  • fcntl

  • dup

  • 基于数据流 ANSI C

fopenfclose
fwritefread
fputcfgetc
fputsfgets
feofferror
fseekrewind
ftell

文件与目录

  • 文件操作

  • chown

  • rename

  • stat

  • dirname

  • basename

  • 目录操作

  • getcwd

IPC 进程间通信

1. 管道

pipemkfifo

2. 信号处理

  • 信号类型
  • psignal
  • kill
  • raise
  • signal
  • sigaction
  • 信号阻塞
  • sigsuspend
  • sigalstack

3.1 IPC对象 System V

消息队列信号量共享内存
msggetsemgetshmget
msgctlsemctlshmctl
msgsndsemopshmat
msgrcvshmdt

3.2 IPC对象 POSIX

  • 消息队列
  • 信号量
  • 共享内存

4. 网络编程

套接字结构套接字函数
字节序转换地址转换
主机服务
  • 带外数据
    • sockatmark

并发编程

1. 进程控制

forkvfork
exec~system
waitwaitpid

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 CPOSIX
timegettimeofday
difftimegetitimer
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摄像头应用编程

https://img-blog.csdnimg.cn/21dba90a20a14cb88612e08d1d9cdbeb.png
https://img-blog.csdnimg.cn/e5b8f35c9a744e63881df9afc27d78c8.png

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)打交道, 程序内部直接调用 OSSALSA 的API。

通过声音服务器

声音服务器介于应用程序和声卡驱动之间。 当不同的应用调用声音服务器的API来播放声音时,它们把音频数据送到服务器, 服务器将一个以上的播放请求混音后,再发送给底层的声卡驱动(ALSA_或_OSS)。 由_ALSA_或_OSS_来驱动声卡播放混音后的数据。 基于_ESD_开发音频程序的好处有:(1)简化开发。(2)即使底层驱动不支持多线程, 通过声音服务器也能实现多个应用程序同时发声。(3)有更好的音效。

  1. ESD
    ESD
    一直是 Gnome 桌面环境的声音服务器, Gnome 应用多是通过 ESD 处理声音的。
  2. aRts
    ESD 对应,aRts 是 KDE 桌面环境的声音服务器, 底层通过 ALSA 驱动声卡。KDE 应用多通过 aRts 处理声音。
  3. 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

http://www.ppmy.cn/news/1168261.html

相关文章

算法进修Day-34

算法进修Day-34 二进制求和 难度:简单 题目要求: 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例1 输入:a “11”, b “1” 输出:“100” 示例2 输入:a “1010”, b “1011…

js 删除树状图无用数据,如果子级没有数据则删除

有一个需求,当你从后端拿到一个树状图的时候,有些子级没数据,这时就需要我们处理一下数据,当然了,如果第一层底下的第二层没数据,第二层底下的所有都没数据,那这一层都不需要。 我的写法&#x…

Vagrant安装Oracle数据库错误的解决

最近笔记本升级到Windows 11后,利用Oralce Vagrant项目安装19.3.0企业版总是出错,错误为: ...oracle-19c-vagrant: Installing : 2:ethtool-4.8-10.el7.x86_64 54/55oracle-19c-vagrant: Installing : o…

车规MCU开发工具之Vector DaVinci Configurator执行arxml合并操作

环境 Step1 导入要合并的arxml 、 Step 2 比较、合并过程 <完>

树上问题相关笔记

LCA LCA&#xff0c;即最近公共祖先。 我们用 f ( i , j ) f(i,j) f(i,j) 表示 i i i 的第 2 j 2^j 2j 级父亲&#xff0c;由于 i i i 的第 2 j 2^j 2j 级父亲可以由它的第 2 j − 1 2^{j-1} 2j−1 父亲向上再跳 2 j − 1 2^{j-1} 2j−1 层得到&#xff0c;那么 i i …

Centos 无法连接 WIFI

环境 硬件&#xff1a;ASUS X550VC, x86_64系统&#xff1a;CentOS 7.9 现象 系统安装后无法上网&#xff0c;终端命令提示符为shadow3dlocalhost&#xff0c;我的疑问是这里不是应该显示我的主机名吗&#xff0c;为什么是localhost呢&#xff1f;突然有些时候&#xff0c;可…

【华为OD机试】分苹果

A、B两个人把苹果分为两堆&#xff0c;A希望按照他的计算规则等分苹果&#xff0c;他的计算规则是按照二进制加法计算&#xff0c;并且不计算进位 1259(1100 01019)&#xff0c;B的计算规则是十进制加法&#xff0c;包括正常进位&#xff0c;B希望在满足A的情况下获取苹果重量…

【SpringBoot】拦截器(Interceptor)的使用

感兴趣的可以查看上一篇过滤器的使用 【Springboot】Filter 过滤器的使用 一、什么是拦截器 拦截器&#xff08;Interceptor&#xff09;是一种特殊的组件&#xff0c;它可以在请求处理的过程中对请求和响应进行拦截和处理。拦截器可以在请求到达目标处理器之前、处理器处理请…