![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux 应用编程
文章平均质量分 81
记录 linux api使用
leon.liao
这个作者很懒,什么都没留下…
展开
-
Linux 应用 - 动态库 - 内存占用
背景在小内存(64M)嵌入式Linux平台上开发中遇到以下两个现象验证公版程序,由于程序文件较大,设备flash中放不下,测试时需要将部分动态库放在SD卡中,插上SD卡,添加SD卡路径到动态库查找路径后再执行程序;程序支持SD卡录像功能,测试录像功能时,在录像过程中拔掉SD卡,程序必现bus err崩溃问题,gdb定位到的错误代码是随机的,但是大部分是保存在SD卡中的动态库中的代码,如果不拔卡能够稳定运行,如果不放动态库在SD中,程序也不会有问题,只是录像写文件会失败。裁减公版程序,程序功能裁减原创 2022-03-25 18:41:54 · 3897 阅读 · 0 评论 -
文件io - 操纵文件空间 - fallocate
说明以普通方式(缓存io)写文件,由于无法预知文件的最终size(即所需磁盘块个数),操作系统无法提前申请好磁盘空间只能按需分配,当系统进程将缓存脏页写入磁盘时,发现内存页没有对应的磁盘空间(磁盘块),系统会触发中断,向存储器申请分配一块,再将数据写入存储器中。磁盘空间预分配:按照用户需求提前分配好磁盘空间(一定数量的磁盘块)。使用录像预分配,以加快录像存储的速度。加速原理减少查找可用块的时间损耗按需分配磁盘块时,每次申请一块磁盘块,申请时存储器需要查找可用磁盘块,需要耗费一定的原创 2021-12-11 17:14:57 · 1229 阅读 · 2 评论 -
Linux 动态库版本管理
说明由于动态库支持动态链接和动态装载,使用中具有很强的动态性,在大型项目中如果缺乏约束,很容易出现版本问题,导致程序运行异常,例如:不小心使用旧版本的动态库文件替代了新版本的动态库。新版本动态库中的接口发生变化而引起,尽管在设计动态库时应该向下兼容,然而要保证动态库完全向下兼容却是不可能的。新版动态库引入了一些新的Bug。…解决方法解决版本问题的首要工作就是标识每一个版本,这就是版本号的作用,但是仅仅使用版本号并不能解决问题,甚至破坏了动态库的动态性,因为版本号不同,不同版本的动态库原创 2021-06-17 17:18:48 · 1521 阅读 · 1 评论 -
pthread库 - 线程同步 - 条件变量
说明多线程编程中,时常会遇到需求:线程需要等待某些条件满足才能继续运行,而这些条件会在别的线程中发生变化。为实现这种需求,应用层简单方法可能是:使用锁+轮询;使用锁来保护“条件变量”的访问,使用轮询的方式来修改和读取“条件变量”的值,然而该方式会有一些不便之处,如下:频繁的锁定和释放锁会有一定的性能浪费。轮询间隔不好把握,间隔时间太短,消耗的CPU资源较多,间隔时间太长,不能很及时的响应请求。条件变量条件变量就是解决以上问题的一种线程同步机制,其做法:采用阻塞线程和消息唤醒的方式可以极原创 2021-03-19 20:42:01 · 567 阅读 · 0 评论 -
进程通信 - 管道
说明管道是一种进程通信方式,可以实现进程之间数据传输。管道是半双工,数据只能向一个方向流动,如需双向通信,可以创建起两个管道。分类Linux支持两种管道机制:无名管道(PIPE)和有名管道(FIFO)。区别:有名管道在文件系统中提供了一个以文件形式存在的访问接口与之关联,而无名管道访问接口和数据传输都在内存中完成,其它进程无法访问,因此无名管道只能用于具有亲缘关系的进程之间的通信(父子进程或者兄弟进程之间),实现依赖于进程文件描述符传递,而有名管道可以用于任何进程之间。无名管道原创 2020-12-24 20:21:33 · 224 阅读 · 1 评论 -
性能优化 - likely和unlikely函数
简介likely与unlikely是内核中定义的两个宏,位于/include/linux/compiler.h中,具体定义如下:#define likely(x) __builtin_expect(!!(x), 1)#define unlikely(x) __builtin_expect(!!(x), 0)__builtin_expect是gcc的内置函数,是一个预处理命令(即起作用于编译时预处理阶段),用于代码优化, 具体定义如下:gcc(version 4.4.0)long __b原创 2020-11-18 11:07:43 · 1812 阅读 · 1 评论 -
归档和压缩
说明压缩或者解压文件和目录只需要一条简单的命令,例如:* 压缩tar zxcf xxx.tar.gz xxx zip -q -r xxx.zip ** 解压tar jxvf xxx.tar.bz2 unzip xxx.zip压缩和解压是站在用户目标角度的命名,但是从技术角度而言,压缩操作可以分为两个行为:归档和压缩,解压操作分为:解压和拆档。压缩并不是归档压缩学习压缩算法可知压缩是减小一块数据的空间占用,数据是一个整体不是离散的,通常是单个文件,目录的数据是离散的。常原创 2020-08-22 17:40:14 · 279 阅读 · 0 评论 -
文件io - 目录操作
说明在linux上一切皆文件,目录本质上也是一个文件,其中保存了该目录下的所有文件的信息列表。用户可以按照普通文件的操作方式去读写目录文件,但是需要按照特定的数据格式,linux提供的目录操作API就是隐藏了格式细节,使目录操作更简单。基础操作头文件#include <dirent.h>打开目录DIR *opendir(const char *name);函数说明:opendir函数用来打开参数name指定的目录, 并返回DIR*形态的目录/文件流,和文件open(原创 2020-10-30 19:37:18 · 219 阅读 · 0 评论 -
并发控制- sched_yield 函数
函数说明sched_yield的作用是让出处理器,调用时会导致当前线程放弃CPU,进程管理系统会把该线程放到其对应优先级的CPU静态进程队列的尾端,然后一个新的线程会占用CPU。详细说明可以查看man中的帮助信息。理解与sleep的区别从作用上来看,sched_yield与sleep很相似,但是差别很大。sched_yield让出CPU后,并不一定会执行另一个进程,可能依然是执行该线程,而sleep一定会等待一段时间,sched_yield函数可以使用另一个级别等于或高于当前线程的线程原创 2020-10-10 18:10:17 · 5751 阅读 · 1 评论 -
高级io函数 - 偏移读写文件(pread & pwrite)
说明对文件进行偏移读写,传统方式使用seek或lseek设置文件偏移再进行读写操作,在linux平台上可以使用pread/pwrite函数。pread和pwrite函数是Linux提供的另外一种读取和写入文件的操作,pread函数的操作可以看作是顺序调用了lseek函数和read函数,同样pwrite函数也类似。详细说明可以通过man查看。对比传统方式pread和pwrite是线程安全的,而传统方式不是。功能一样,但是系统调用更少,性能更高。pread和pwrite是原子操作,而传统方式原创 2020-07-20 20:56:09 · 1518 阅读 · 0 评论 -
应用层定时器 timerfd
简介timerfd 接口是Linux内核从版本2.6开始提供的定时器接口,非常适合用来实现应用层定时器模块优点在内核中采用高精度定时器不同于sleep等延时函数,时间精度非常高使用简单,时间处理在内核实现,应用层不需要太多处理接口基于文件描述符,适合 select/poll/epoll管理接口说明头文件sys/timerfd.h创建定时器int timerfd_cre...原创 2019-07-13 16:43:13 · 399 阅读 · 0 评论