Linux_API_系列-整体概览

总论

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.rhkb.cn/news/168798.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ相关的其他知识点

RabbitMQ相关的其他知识点 一、幂等性1.1 概念1.2 消息重复消费1.3 消费端的幂等性保障 二、优先队列2.1 应用场景2.2 实现原理2.3 代码实现 三、惰性队列3.1 定义3.2 应用场景3.3 两种设置模式3.4 内存开销对比 一、幂等性 1.1 概念 用户对于同一操作发起的一次请求或者多次请…

初识JAVA,带你入门

本章重点: 1. Java语言简介、发展概述、语言优势、与C/C区别 2. 初识Java程序入口之main方法 3. 注释、标识符、关键字 1. Java语言概述 1.1 Java是什么? Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义…

操作系统学习笔记7-IO管理

文章目录 1、IO管理学什么(学习逻辑图)2、IO管理硬件知识-IO设备的分类(硬件分类)3、IO管理硬件知识-IO控制方式的发展过程4、IO管理硬件知识-IO控制方式-程序直接控制方式5、IO管理硬件知识-IO控制方式-中断控制方式6、IO管理硬件知识-IO控制方式-DMA控制方式7、IO管理硬件知识…

中心胖AP(AD9430DN)+远端管理单元RU(R240D)+出口网关,实现组网

适用于:V200R008至V200R019C00版本的万兆中心胖AP(AD9431DN-24X)。 组网规划 RU管理:VLAN 100,网段为192.168.100.0/24。 无线业务:VLAN 3,SSID为“wlan-net”,密码为“88888888”…

安卓富文本部分高亮及点击事件

安卓富文本部分高亮及点击事件 前言一、富文本是什么?二、实现方法1.使用html2.使用SpannableString 总结 前言 富文本其实不是很常用,但有遇到了过后使用很方便的场景,例如免责声明。这时候就很重要了,前段时间遇到了&#xff0…

软件测试(概念篇)

前言 从这篇博客开始,我们将开始正式学习测试,在开始第一次软件测试之前,我们需要先了解软件测试的一些基本概念。 这些基本概念将帮助我们更加明确工作的目标,以便于更快的融入到测试团队中去   在这里我们将回答以下问题&…

vue v-for

目录 前言:Vue.js 中的 v-for 指令 详解:v-for 指令的基本概念 用法:v-for 指令的实际应用 1. 列表渲染 2. 动态组件 3. 表单选项 4. 嵌套循环 5. 键值对遍历 解析:v-for 指令的优势和局限性 优势: 局限性&a…

希捷推出Exos系列24TB硬盘:配备增强型缓存 性能提高三倍

希捷推出了全新的Exos 24TB硬盘。其基于传统的CMR构建,为3.5英寸规格,转速为7200 RPM。 同时,Exos系列24TB硬盘拥有10片磁盘,每片磁盘的容量为2.4TB,是希捷存储密度最高的硬盘,适用于超大规模企业和数据中心…

s27.linux运维面试题分享

第一章 计算机基础和Linux安装 1.冯诺依曼体系结构组成部分 计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。2.Linux哲学思想(或Liunx基本原则、思想、规则) 一切都是一个文件(包括硬件)。小型,单一用途的程序。连…

贪心算法(1)--经典贪心算法

目录 一、活动安排问题 二、最优装载问题 三、分数背包问题 四、多机调度问题 一、活动安排问题 1、策略 活动安排问题:设有n个活动的集合E{1,2,...,n},每个活动i都有一个使用该资源的起始时间和一个结束时间,且。如果选择了活动i则它在…

网络编程的学习初篇

网络原理初始 网络原理和网络编程[重要] 网络能够跨主机通信! 我们未来工作,很可能是成为后端开发工程师,写服务器,和客户端通信,肯定会涉及到网络. 网络初始 计算机网络的由来 ~~ 计算机网络这是计科相关专业最核心的专业课!!! 计算机是咋来的??最初是用来计算弹道导弹的轨…

Kubernetes技术与架构-Ingress Controller

Ingress Controller控制器是实现Ingress对象的定义的组件,也即网关,负责Kubernetes集群内流量的分发,Kubernetes可以运行多个Ingress Controller控制器实例,不同的Ingress定义可以使用不同的Ingress Controller控制器实现&#xf…

搞个微信小程序002:个人信息

新建一个用于&#xff0c;和001中一样&#xff0c;然后&#xff0c;就改掉两个文件&#xff1a; index.wxml: <view><!-- 头像区域 --><view class"top"><view class"user-img"><image src"/images/tx.png"><…

PostgreSQL 插件 CREATE EXTENSION 原理

PostgreSQL 提供了丰富的数据库内核编程接口&#xff0c;允许开发者在不修改任何 Postgres 核心代码的情况下以插件的形式将自己的代码融入内核&#xff0c;扩展数据库功能。本文探究了 PostgreSQL 插件的一般源码组成&#xff0c;梳理插件的源码内容和实现方式&#xff1b;并介…

mybatis写sql

批量查询 <select id"getPreIds" resultType"java.lang.String"parameterType"java.util.List">SELECT pre_batch_id FROM public.mine_data_quality_check_record WHERE deleted0<if test"list ! null">AND pre_batch…

codeshell安装配置

codeshell安装配置 1 注意事项1.1 Python版本问题 2 codeshell环境搭建2.1 codeshell使用软件各版本2.2 软件下载2.3 codeshell使用环境安装2.3.1 python-3.10.9-amd64.exe安装2.3.2 Anaconda3-2022.10-Windows-x86_64.exe安装2.3.3 创建环境2.3.4 Pytorch安装2.3.5 transforme…

C++初阶 入门(2)

目录 一、缺省函数 1.1什么是缺省函数 1.2为什么要有缺省函数 1.3使用缺省函数 1.4测试代码 二、函数重载 2.1什么是函数重载 2.2为什么要有函数重载 2.3什么情况构成函数重载 2.4函数重载例子及代码 三、引用 3.1什么是引用 3.2如何引用 ​3.3常引用(可略过) 3…

CCF CSP认证历年题目自练Day38

题目 试题编号&#xff1a; 201409-3 试题名称&#xff1a; 字符串匹配 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   给出一个字符串和多行文字&#xff0c;在这些文字中找到字符串出现的那些行。你的程序还需支持大小写敏感…

酒类商城小程序怎么做

随着互联网的快速发展&#xff0c;线上购物越来越普及。酒类商品也慢慢转向线上销售&#xff0c;如何搭建一个属于自己的酒类小程序商城呢&#xff1f;下面就让我们一起来看看吧&#xff01; 一、登录乔拓云平台 首先&#xff0c;我们需要进入乔拓云平台的后台&#xff0c;点击…

《向量数据库》——Zilliz X Dify.AI ,快速打造知识库 AI 应用

Zilliz 大模型生态矩阵再迎新伙伴!近日,Zilliz 和 Dify.AI 达成合作,Zilliz 旗下的产品 Zilliz Cloud、Milvus 与开源 LLMOps 平台 Dify 社区版进行了深度集成。 01. Zilliz Cloud v.s. Dify Dify 作为开源的 LLMs App 技术栈,在此前已支持丰富多元的大型语言模型的接入,…