Linux_API_系列-整体概览-程序员宅基地

技术标签: 运维  linux  服务器  

总论

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

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

Linux基础API

文件

文件I O

fopen fclose
fwrite fread
fputc fgetc
fputs fgets
feof ferror
fseek rewind
ftell

文件与目录

IPC 进程间通信

1. 管道

pipe mkfifo

2. 信号处理

3.1 IPC对象 System V

消息队列 信号量 共享内存
msgget semget shmget
msgctl semctl shmctl
msgsnd semop shmat
msgrcv shmdt

3.2 IPC对象 POSIX

4. 网络编程

套接字结构 套接字函数
字节序转换 地址转换
主机 服务

并发编程

1. 进程控制

fork vfork
exec~ system
wait waitpid

2. 多线程

3. IO多路复用

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 获取系统环境变量的值

命令行

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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bbdxf/article/details/133944557

智能推荐

使用nginx解决浏览器跨域问题_nginx不停的xhr-程序员宅基地

文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr

在 Oracle 中配置 extproc 以访问 ST_Geometry-程序员宅基地

文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc

Linux C++ gbk转为utf-8_linux c++ gbk->utf8-程序员宅基地

文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8

IMP-00009: 导出文件异常结束-程序员宅基地

文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束

python程序员需要深入掌握的技能_Python用数据说明程序员需要掌握的技能-程序员宅基地

文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)_@service beanname-程序员宅基地

文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname

随便推点

二叉树的各种创建方法_二叉树的建立-程序员宅基地

文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立

解决asp.net导出excel时中文文件名乱码_asp.net utf8 导出中文字符乱码-程序员宅基地

文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码

笔记-编译原理-实验一-词法分析器设计_对pl/0作以下修改扩充。增加单词-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词

android adb shell 权限,android adb shell权限被拒绝-程序员宅基地

文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限

投影仪-相机标定_相机-投影仪标定-程序员宅基地

文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定

Wayland架构、渲染、硬件支持-程序员宅基地

文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland

推荐文章

热门文章

相关标签