Linux_API_系列-整体概览

news2024/11/18 17:19:49

总论

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.coloradmin.cn/o/1118268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux进程概念(下)

僵尸进程 进程内核数据结构PCB进程的代码和数据,都要占据内存空间,那么进程退出的核心工作之一:即将PCB和自己的代码和数据释放掉 我们创建进程的目标一定是为了完成某种任务,父进程/OS要知道该进程把任务完成的怎么样&#xff…

轻松实现批量转换,将JPG图片一键转换为PNG格式!

在处理大量图片时,将JPG格式图片转换为PNG格式可能会耗费您大量的时间和精力。为了让您的工作更加轻松,我们为您推出了一款高效的批量图片处理工具,让您能够轻松将JPG图片一键转换为PNG格式,提高处理效率! 首先&#…

使用命令行cli脚手架创建uniapp项目(微信小程序、H5、APP)

除了使用HBuilderX工具可视化搭建项目外,DCloud官方还提供了一个脚手架用于命令行搭建项目。 uni-app项目支持 uni cli和 HBuilderX cli两种脚手架工具: uni cli:面向非HBuilderX的用户(如习惯使用vscode/webstorm的开发者&#…

【数据结构】八大排序

目录 1. 排序的概念及其作用 1.1 排序的概念 1.2 排序运用 1.3 常见的排序算法 2. 常见排序算法的实现 2.1 插入排序 2.1.1 基本思想 2.1.2 直接插入排序 2.1.3 希尔排序(缩小增量排序) 2.2 选择排序 2.2.1 基本思想 2.2.2 直接选择排序 2.2…

掌握Java中的volatile关键字

高速缓存 什么是高速缓存 高速缓存(Cache)是一种用于存储计算机数据的临时存储设备,用于加速数据访问速度,减少对主存储器(RAM)或磁盘的频繁访问。高速缓存通过将最常用的数据存储在更接近CPU的位置&…

使用Perl和WWW::Mechanize库编写

以下是一个使用Perl和WWW::Mechanize库编写的网络爬虫程序的内容。代码必须使用以下代码:jshk.com.cn/get_proxy 首先,确保已经安装了Perl和WWW::Mechanize库。如果没有,请使用以下命令安装: cpan WWW::Mechanize创建一个新的Pe…

【MATLAB源码-第52期】基于matlab的4用户DS-CDMA误码率仿真,对比不同信道以及不同扩频码。

操作环境: MATLAB 2022a 1、算法描述 1. DS-CDMA系统 DS-CDMA (Direct Sequence Code Division Multiple Access) 是一种多址接入技术,其基本思想是使用伪随机码序列来调制发送信号。DS-CDMA的特点是所有用户在同一频率上同时发送和接收信息&#xf…

抖音热搜榜:探索热门话题的独特魅力

在信息爆炸的时代,我们每天都会接收到大量的信息,而抖音热搜榜就像是一个窗口,让我们能够窥见当下最受欢迎、最具话题性的内容。作为全球最受欢迎的短视频平台之一,抖音凭借其海量的内容、独特的推荐算法,让越来越多的…

阿里低代码Low Code Engine快速上手

一、环境准备 在正式开始之前,我们需要先安装相应的软件:WSL、Node等。Window 环境需要使用 WSL 在 windows 下进行低代码引擎相关的开发。安装教程➡️ WSL 安装教程。对于 Window 环境来说,之后所有需要执行命令的操作都是在 WSL 终端执行的。 2.1 Node 推荐安装Node 1…

Topaz Photo AI forMac/win:革命性的图片降噪软件

Topaz Photo AI是一款革命性的图片降噪软件,它利用人工智能技术对图片进行降噪处理,让你的照片焕然一新。与传统的降噪软件不同,Topaz Photo AI不仅降噪效果更出色,而且操作简单,让你可以轻松地提升图片质量。 Topaz …

CUDA学习笔记6——事件计时

事件计时 CUDA事件是直接在GPU上实现的,因此它们不适用于对同时包含设备代码和主机代码的混合代码计时。 cudaEventCreate 创建一个事件cudaEventRecord 记录一个事件cudaEventElapsedTime 计算两个事件之间经历的时间,第一个参数为某个浮点变量的地址…

MS12_020 3389远程溢出漏洞

1.search ms12_020 搜索ms12_020 2.use auxiliary/scanner/rdp/ms12_020_check 检查是否存在ms12_020漏洞 show options 查看所需参数 set RHOSTS x.x.x.x 设置目标IP地址 run 执行 检测出来有Ms12_020漏洞 3.use auxiliary/dos/windows/rdp/ms12_020_maxchannelids 选择…

SMOS土壤水分产品下载

SMOS土壤水分产品下载 打开下载网站 打开网站 打开DATA下的SMOS 然后找到SMOS的L1和L2data 首先需要注册一下,在该网站 然后找到了SMOS的NRT土壤水分产品,该产品从2010年开始,一直发布到现在,是基于L波段。 这里就是每天的土…

卷积神经网络CNN学习笔记-MaxPool2D函数解析

目录 1.函数签名:2.学习中的疑问3.代码 1.函数签名: torch.nn.MaxPool2d(kernel_size, strideNone, padding0, dilation1, return_indicesFalse, ceil_modeFalse) 2.学习中的疑问 Q:使用MaxPool2D池化时,当卷积核移动到某位置,该卷积核覆盖区域超过了输入尺寸时,MaxPool2D会…

emqx 启动正常,但是1883端口无法telnet,emqx无法正常工作

emqx一直正常工作,后面突然就不工作了,查找日志,发现报错说设备空间不足,但是我记得华为云SSD从40G扩容到500G,不至于空间不足,于是运行df -Dh确实显示只有40G,运行lsblk确实有500G,…

2016-2023全国MPA国家A类线趋势图:浙大MPA要高多少?

公共管理硕士(MPA)项目的国家线这些年相对比较平稳,虽然以体制内考生为主的项目总体应试能力是比较强的,但因为全国mpa项目众多,能力参差不齐,导致每年的国家线划定也需要考虑综合情况。根据专注浙大的杭州…

Qt实现一个电子相册

一、要实现的功能 在窗口中可以显示图片,并且能够通过两个按钮进行图片的前进和后退的顺序切换。有一个按钮,通过这个按钮可以从所存图片资源中随机选取一个图片进行展示通过按钮可以控制图片自动轮播顺序切换的开始与停止,显示当前系统的时…

Spring framework day 03:Spring 整合 Mybatis(分页)

前言 在当今快速发展的软件开发领域,Java作为一种广泛使用的编程语言,以其强大的生态系统和丰富的框架而备受推崇。而在Java开发中,Spring框架几乎成为了事实上的标准,它为开发者提供了一种优雅且高效的方式来构建企业级应用程序…

CVE-2019-0708漏洞实战

使用命令:search 0708搜索exp脚本 搜索网段中主机漏洞 use auxiliary/scanner/rdp/cve_2019_0708_bluekeep 照例,show options 看一下配置 设置网段set RHOSTS x.x.x.x run运行就行了 使用攻击模块 use exploit/windows/rdp/cve_2019_0708_bluekee…