
Linux C高阶
文章平均质量分 73
嵌入式Linux C实战开发高阶知识
奇妙之二进制
csdn博客专家,C/C++领域优质创作者,抖音搜奇妙之二进制,专注于Linux C/C++、嵌入式Linux开发,偶尔谈谈人生,目前致力于完成大约500篇的linux C/C++开发知识体系库,所有的文章都会一直保持更新(优化内容、排版),想学习的可以订阅我的专栏,也可以关注Linux 世界。
展开
-
mmap映射文件使用示例
mmap 零拷贝技术可以应用于很多场景,其中一个典型的应用场景是网络文件传输。假设我们需要将一个大文件传输到远程服务器上。在传统的方式下,我们可能需要将文件内容读入内存,然后再将数据从内存复制到网络协议栈中,最终发送到远程服务器。这个过程中,涉及到了多次数据拷贝操作,增加了 CPU 的开销,降低了传输效率。而使用 mmap 零拷贝技术,则可以将文件映射到内存中,然后直接将内存中的数据传输到网络协议栈中,避免了数据在内核和应用程序之间的复制,从而提高了传输效率。原创 2024-02-18 15:29:16 · 1271 阅读 · 0 评论 -
嵌入式架构师成长之路--架构设计
而我之所以推崇多进程的原因就是,多进程能从物理上隔绝了这种“方便”的通讯方式,导致在想实现一个模块交互时,会多思考下这个交互是必要的吗,如果是必要的,则会进一步思考接口定义是否简单明了(因为进程间的通讯相对会麻烦些,开发人员会本能减少交互,明确接口的想法去仔细考虑接口,协议的定义,否则折腾的是自己了),这如同人生,如果一直顺风顺水,人们可能不会想太多,思考太多,而如果道路上有些坎坷,则会有另一种感悟吧。而如果采用多进程的模型,好吧,你的服务进程挂了,你自己找原因吧,没什么可争辩的了。原创 2024-02-18 15:08:14 · 1097 阅读 · 0 评论 -
Linux C高阶(28)将一个负数赋值给一个无符号数会出现什么情况呢
在正文开始之前,我们先看一下下面这段看似简单的代码:#include <stdio.h>int main(){ char a = -1; signed char b = -1; unsigned char c = -1; printf("a=%d,b=%d,c=%d\n", a, b, c); return 0;}那么这段代码的输出结果是什么呢?答案是:-1-1255关于上面的代码,首先我们要说的缺省情况下的char内心是有符号的,转载 2021-11-21 00:03:53 · 6714 阅读 · 0 评论 -
Linux C高阶(26)linux进程隐藏 hook readdir函数 挂载覆盖/proc/pid目录
文章目录前言一、应用层下 hook 函数调用实现隐藏二、挂载覆盖/proc/pid 目录三、总结前言上篇介绍了如何在有源码的情况下,通过 argv[] 及 prctl 对进程名及参数进行修改,整篇围绕/proc/pid/目录和 ps、top 命令进行分析,做到了初步隐藏,即修改了 /proc/pid/stat 、/proc/pid/status 、/proc/pid/cmdline 这些文件的信息,使得 ps、top 命令显示了虚假的进程信息;但是还存在一些缺点:1.ps、top 命令还是显示了真实的转载 2021-10-25 01:15:42 · 1300 阅读 · 0 评论 -
Linux C高阶(25)通过netlink机制检测usb热插拔
Netlink socket 是一种Linux特有的socket,用于实现用户进程与内核进程之间通信的一种特殊的进程间通信方式(IPC) ,也是网络应用程序与内核通信的最常用的接口。Netlink 是一种在内核和用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就能使用 Netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 Netlink。Android udev机制就是采用的PF_NETLINK....原创 2021-05-13 16:41:12 · 1409 阅读 · 1 评论 -
Linux C高阶(21)监听键盘单个按键输入
文章目录1 前言2 终端IO的三种模式2.1 canonical 模式2.2 nocanonical 模式2.3 raw 模式3 终端控制结构1 前言编写测试工具的时候,需要实时的读取终端的输入(不需要按下enter键才读取), 然后执行相应命令,所以研究了下如何在linux下监听键盘信息。本例子采用了阻塞读取串口终端的方式,可以修改成另起一个线程。2 终端IO的三种模式2.1 canonical 模式这个模式也叫做cooked模式。在这种模式下,终端设置每次返回一行数据,换句话说就是遇到换行符才原创 2021-05-12 19:28:16 · 2599 阅读 · 2 评论 -
Linux C高阶(20)重定向串口打印到telnet(方便远程调式)
在嵌入式开发中,我们都是使用串口进行调试定位问题。然而在成品调试或者远程调试时,没有串口,只能telnet进去,少了很多应用进程的打印,这样就不利于我们发现问题。需要一种方法把串口所有输出重定向到telnet。 这就涉及到一些终端概念,可以参考博文linux下tty, ttyn, pts, pty, ttySn, console理解。主要是利用tty的ioctl重定向方法来实现重定向,下...原创 2018-07-04 17:00:55 · 3651 阅读 · 2 评论 -
Linux C高阶(19)C语言隐式类型转换的陷阱
微信公众号:二进制人生专注于嵌入式linux开发。更新:2020/05/21,转载请注明出处。隐式类型转换是C语言的一大诡异之处,语句或表达式通常应该只使用一种类型的变量和常量。然而,如果你混合使用类型,C使用一个规则集合来自动完成类型转换。这可能很方便,但也很危险。当出现在表达式里时,有符号和无符号的char和short类型都将自动被转换为int类型,在需要的情况下,将自动被转换为unsigned int(在short和int具有相同大小时)。这称为类型提升。提升在算数运算中通常不会有什么.原创 2020-07-25 22:39:56 · 6046 阅读 · 2 评论 -
Linux C高阶(18)用C写一个项目级动态数组
微信公众号:二进制人生专注于嵌入式linux开发。更新日期:2020/1/9,转载请注明出处。最近在收集轮子或者造轮子,意在写一个嵌入式linux通用库,包含常用的各种数据结构和接口。文章目录前言数据结构和接口实现创建销毁初始化去初始化获取元素插入元素测试代码前言本文动态数组的设计思想和代码搬自nginx。nginx是一款优秀的开源web服务器,其源代码100%由C编写。在百度上搜索一下nginx的市场份额,得到以下结果:这几年各大服务器的市场占有走势折线图:足见其地位。今天我们来.原创 2020-07-26 11:21:23 · 6074 阅读 · 1 评论 -
Linux C高阶(17)封装接口获取设备ip地址
方法有许多,仅给出最容易看的一种#include <stdio.h>#include <arpa/inet.h>#include <netdb.h>#include <sys/types.h> #include <fcntl.h>#include <arpa/inet.h>#include <...原创 2018-08-15 15:32:05 · 2015 阅读 · 2 评论 -
Linux C高阶(14)C语言宏定义你所不知道的事
微信公众号:二进制人生专注于嵌入式linux开发。问题或建议,请发邮件至hjhvictory@163.com。更新日期:2020/1/24,内容整理自网络,转载请注明出处。文章目录规避语法错误什么时候使用宏定义规避语法错误众所周知,C语言支持宏定义,并且功能强大。举个例子:#include <stdio.h>#define swap(a,b) {int t=a;a=b;b=t;}int main(){ int x = 1, y = 2; swap(x, y); pri.原创 2020-07-25 22:36:58 · 5985 阅读 · 1 评论 -
Linux C高阶(12)结构体位域10大罪名
微信公众号:二进制人生专注于嵌入式linux开发。更新:2020/05/20,内容整理自网络。有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示.原创 2020-07-25 22:34:18 · 6041 阅读 · 1 评论 -
Linux C高阶(11) 多线程变量自增问题分析
微信公众号:二进制人生专注于嵌入式linux开发。更新:2020/05/08,内容整理自网络。考虑变量i++的操作,实际上可以分解为以下3步:(1)从内存单元读入寄存器;(2)在寄存器中对变量做增量操作;(3)把新的值写回内存单元。如果两个线程试图几乎在同一时间对同一变量做增量操作而不进行同步的话,结果可能就不一致了,在上述代码中,我们传进线程函数的是变量的地址,那么变量i自增后,可能还没有写回内存单元,就被另一个线程读取了。好了,我们现在提出一个问题,假设一个全局变量a = 0,创建了.原创 2020-07-26 14:50:50 · 8174 阅读 · 1 评论 -
Linux C高阶(10)一个简单易用的开源http请求库C实现--ghttp
微信公众号:二进制人生专注于嵌入式linux开发。问题或建议,请发邮件至hjhvictory@163.com。更新日期:2020/1/15,转载请注明出处。愿你有所收获…图 二进制人生公众号内容目录前言用libghttp实现http get请求用libghttp实现http post请求异步模式示例缺陷分析include include include "ghttp.h"...原创 2020-01-14 16:38:29 · 9611 阅读 · 1 评论 -
Linux C高阶(9)写一个项目级别的线程池
微信公众号:二进制人生专注于嵌入式linux开发。更新日期:2020/1/19,转载请注明出处。愿你有所收获…快过年了,应该会停更一段时间,提前祝我的各位读者们新年快乐,2020年会有更好的发展!最近在收集轮子或者造轮子,意在写一个嵌入式linux通用库,包含常用的各种数据结构和接口。文章目录什么是线程池基本数据结构项目级封装什么是线程池线程池是一种高并发下常用的任务后台处理模型,主要是避免为短时间处理的任务进行频繁的线程创建和销毁,以及系统中过多的线程导致过度调度,而这些都.原创 2020-07-26 11:15:28 · 7664 阅读 · 1 评论 -
Linux C高阶(8)循环队列C实现
微信公众号:二进制人生专注于嵌入式linux开发。问题或建议,请发邮件至hjhvictory@163.com。更新:2019/12/26###内容目录文章目录###什么是队列队列是一种操作受限的线性表,其限制条件为允许在表的一端进行插入,而在表的另一端进行删除。插入的一端叫做队尾,删除的一端叫做队头。向队列中插入新元素的行为称为入队,从队列中删除元素的行为称为出队。队列的特点是先...原创 2019-12-26 13:43:13 · 8201 阅读 · 1 评论 -
Linux C高阶(7)异步处理框架C实现
微信公众号:二进制人生专注于嵌入式linux开发。问题或建议,请发邮件至hjhvictory@163.com。更新:2019/12/13内容目录(支持跳转)引子数据结构和接口实现反思引子今天跟大家分享一个我在实际工作中运用得最多的框架:异步执行队列。在开发中,我们可能经常会遇到一些执行时间需要很长的任务,如果让程序处理完任务再继续往下走,可能会耽误到程序的主体业......原创 2019-12-13 17:24:48 · 7417 阅读 · 2 评论 -
Linux C高阶(6)C语言写一个漂亮的位图
Bitmap翻译成中文就是位图。所谓bitmap,就是用每一位来表示一个事物的某种状态,由于只有一位,所以这个状态值只能是0或者1,很多个同类事物的状态就构成了一个状态位图。这个二值状态常用来表示存在或不存在,使用了或者没使用。举一个通俗的例子,开会签到,会有一个签到名单,哪个同学来了就在他名字后面打钩。在偷懒的时候可以用一个数组来表示同学的签到状态,为了节省空间,我用1个字节来表示该状态,96。原创 2020-07-26 14:38:36 · 6386 阅读 · 1 评论 -
Linux C高阶(5)arm架构函数帧栈分析
微信公众号:二进制人生专注于嵌入式linux开发。问题或建议,请发邮件至hjhvictory@163.com。更新:2020/04/26。图:二进制人生公众号本文研究的是arm架构的函数帧栈,阅读者需要有arm汇编基础,不过本文涉及的汇编指令不是很多。理论上来说,ARM的15个通用寄存器是通用的,但实际上并非如此,特别是在过程调用的过程中。以下4个寄存器有特殊用途:R11:f...原创 2020-05-06 22:38:23 · 7167 阅读 · 1 评论 -
Linux C高阶(4)利用malloc提供的回调注册机制--定位内存泄漏
微信公众号:二进制人生专注于嵌入式linux开发。问题或建议,请发邮件至hjhvictory@163.com。更新日期:2020/04/13,内容整理自网络,转载请注明出处。图:二进制人生公众号通过在malloc、free之前或者之后打印调试信息或者其他统计操作,可以帮助定位内存泄露问题。我们通常通过修改malloc来实现这一目的。网上写了很多种修改malloc的方法:...原创 2020-05-06 22:25:47 · 6452 阅读 · 1 评论 -
Linux C高阶(3)封装一个可靠的system函数
微信公众号:二进制人生专注于嵌入式linux开发。更新:2019/12/25在代码中执行Linux命令的这个需求在嵌入式开发中很常见,好在Linux已经提供了这样的系统函数:system()。初级工程师可能会直接拿来使用,但为了在该函数执行出问题时能够收集错误信息,我对这个函数进行了封装。/* 封装system系统函数,打印记录错误 */int My_System(const char *cmd){ int status = -1; char logbuf[128] = {0.原创 2020-07-26 14:43:06 · 6319 阅读 · 2 评论 -
Linux C高阶(2)linux下程序编译链接过程
动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够按操作系统装入执行的统一整体。了解了这四个过程中所做的工作,对我们理解头文件、库等的工作过程是有帮助的,而且清楚的了解编译链接过程还对我们在编程时定位错误,以及编程时尽量调动编译器的检测错误会有很大的帮助的。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。原创 2020-07-26 14:53:02 · 6386 阅读 · 1 评论 -
Linux C高阶(1)大话C语言函数指针
微信公众号:二进制人生专注于嵌入式linux开发,内容整理自网络。文章目录什么是函数指针如何定义函数指针如何用函数指针调用函数用typedef定义函数指针类型高级用法--将一块地址转为函数指针,并进行调用函数指针的实际应用--回调函数什么是函数指针如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。如何定义函.原创 2020-07-25 22:25:08 · 6034 阅读 · 1 评论