C语言学习
fangye945a
行远必自迩,登高必自卑。
展开
-
OpenHarmony安全函数返回值判断
在向OpenHarmony贡献代码时,涉及内存操作时都必须使用安全函数,并且要求对返回值进行正确的处理。下面整理一下常用的内存操作安全函数及其返回值含义,便于今后使用。原创 2022-07-07 21:30:00 · 1123 阅读 · 0 评论 -
gcc之-Wl,--wrap,xxx包装函数用法
在编译代码时,有时候遇到需要实现一个函数,替换标准库中的函数。重复定义是个很头疼的事,使用–warp参数来指定真正要链接的函数,可以达到重写函数的目的。原创 2022-02-22 23:54:47 · 3262 阅读 · 4 评论 -
GD32片内flash读写数据
GD32现在越来越火,应用也越来越广泛。我们在开发项目的时候,总会有需要掉电存储一些配置信息的时候,但是使用外挂flash、或者EEPROM,或多或少都会占用一些外围接口或增加一定的成本。于是,直接将配置参数存储到片内flash上还是会更香一些。一般flash的擦写次数能够达到10万次,若擦写操作不太频繁,完全是够用的。...原创 2021-07-17 20:57:08 · 21280 阅读 · 15 评论 -
如何控制某段代码不使用编译优化
#pragma GCC push_options#pragma GCC optimize ("O0")your code#pragma GCC pop_options原创 2021-06-29 10:21:42 · 5209 阅读 · 1 评论 -
linux文件写入效率测试
测试代码,供大家参考:#include <stdio.h>#include <string.h>#include <sys/time.h>#include <signal.h>int main_running_flag = 0;static void main_exit_proc(int signal){ switch(signal) { case SIGINT: { main_running_flag = ...原创 2020-08-16 19:36:40 · 1507 阅读 · 0 评论 -
C语言之mot文件解析
Motorola S-records 16进制文件的另一种常见格式,许多控制器程序都是。原创 2020-07-19 00:45:04 · 9353 阅读 · 14 评论 -
Sleep()函数失效的问题(WSL)
最近在指导新员工安装windows10 的Ubuntu子系统,写代码时发现其调用sleep函数无效,调用sleep直接返回,不会阻塞。查询相关资料才知道,原来是windows10子系统解决方法参考:https://blog.csdn.net/sinat_27953939/article/details/106473347?fps=1&locationNum=2...原创 2020-07-06 23:50:40 · 3664 阅读 · 3 评论 -
几种C语言奇特用法及使用误区
Top1: switch还能这样用?#include <stdio.h>int main(int argc, char *argv[]){ int a = 0; scanf("%d",&a); switch(a) { case 0 ... 10: printf("a = %d\n",a);原创 2020-06-17 14:50:30 · 453 阅读 · 0 评论 -
位运算实现两个数相加
最近在网上做题,要求不用四则运算(+、-、*、/)实现两个数相加。我们首先想到的就是用位运算来实现,觉得挺有意思,也是对计算机底层运算原理的一个理解,故对其做了一个记录和原理分析。函数实现如下图所示:int add(int num1, int num2){ int tmp1 = num1^num2; int tmp2 = (num1&num2)<<1; while(tmp2) { num1 = tmp1^tmp2;...原创 2020-06-14 22:51:08 · 1626 阅读 · 0 评论 -
C/C++判断某个程序是否在运行
Windows判断进程是否在运行:bool ret = false; HANDLE info_handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //拍摄系统中所有进程的快照 if(info_handle == INVALID_HANDLE_VALUE) { printf("CreateToolhelp32Snapshot fail!!\n\n"); return false;原创 2020-05-27 23:45:03 · 11528 阅读 · 0 评论 -
GCC语言之__attribute__用法
__attribute__ 是一个编译器指令,其实是 GNU C 的一种机制,本质是一个编译器的指令,在声明的时候可以提供一些属性,在编译阶段起作用,来做多样化的错误检查和高级优化。用于在 C、C++、Objective-C 中修饰变量、函数、参数、方法、类等。合理使用 __attribute__ 有什么好处?给编译器提供上下文,帮助编译器做优化,合理使用可以收到显著的优化效果。 编译器...原创 2020-02-21 21:55:19 · 1263 阅读 · 0 评论 -
C语言不使用中间变量交换两个变量值
1.加减法#include <stdio.h>int main(int argc, char *argv[]){ int a=1,b=2; a=a+b; b=a-b; a=a-b; printf("a=%d b=%d",a,b);}适用于交换整型变量,浮点型变量交换可能会损失精度。2.乘除法#include <stdio.h>i...原创 2019-11-25 22:18:50 · 3334 阅读 · 2 评论 -
C语言三目运算符省略?与:之间的参数
最近在项目代码中看到了使用三目运算符省略了?与:之间的参数的用法,对此用法感到疑惑,虽然不建议这么些,但是下次遇到得知道是什么意思吧?为了弄清该用法具体意义,于是写了如下代码进行验证:#include <stdio.h>int main(int argc, char *argv[]){ int a = 200; int b = 0; ...原创 2019-10-26 00:30:02 · 1859 阅读 · 0 评论 -
linux获取SD卡分区使用百分比
在嵌入式系统中经常用到SD卡作数据存储,但由于SD卡存储大小有限,需要对磁盘使用量进行判断,防止数据存储失败。获取方法: 使用statfs函数查询文件系统状态信息,通过分区信息中的block总大小、使用量即可计算使用百分比。1、在终端输入man statfs 查看函数statfs详细用法:2、需要包含头文件#include <sys/vfs.h> 或者...原创 2018-12-16 00:33:35 · 2148 阅读 · 1 评论 -
C语言递归读取文件夹示例
项目开发过程中经常需要读取目录下所有文件,故总结此递归读取文件夹下所有文件的示例程序以作备忘。#include <stdio.h>#include <dirent.h>#include <sys/stat.h>#include <string.h>int read_dir_r(char *path){ DIR *d...原创 2019-01-28 21:53:57 · 2366 阅读 · 0 评论 -
popen获取系统调用的结果
在C/C++编程中,经常使用system函数调用shell命令,但是无法获得运行的shell命令执行的输出结果。而使用popen能够获取到输出结果。(使用popen后,必须使用pclose关闭)函数原型:FILE*popen(constchar*command,constchar*type);intpclose(FILE*stream...原创 2019-02-15 23:20:55 · 1769 阅读 · 0 评论 -
linux获取可执行文件名及进程ID
最近项目需要做应用管理,需要知道运行的应用名称及其进程ID,用于监控程序的资源占用情况。 首先是获取可执行文件名,需要用到readlink()函数,但是readlink获取的是可执行文件的绝对路径,需要用到strrchr()函数进行字符串处理,去掉路径,提取出可执行文件名。readlink()函数用法:strrchr()函数用法:获取可执行文件名函数代码如下:...原创 2019-02-25 23:46:06 · 2697 阅读 · 0 评论 -
linux C语言根据可执行文件名获取进程运行信息
最近项目中需要对程序的运行状态进行监控,于是想到参考top源码来实现。参考博客:https://blog.csdn.net/earbao/article/details/51277087如下示例可根据可执行文件名获得线程数、虚拟内存占用大小、物理内存占用大小、进程PID、CPU占用率和进程启动次数等信息。1.程序源码main.c#include <stdio.h>...原创 2019-03-27 21:09:42 · 3105 阅读 · 0 评论 -
Socket TCP服务程序示例
在socket网络编程中,许多应用场景需要用到TCP服务端,监听本地端口,处理TCP客户端连接,与多个客户端进行通信。而处理多个连接,与多个连接进行通信,还是要花点功夫的。 为了方便日后能够快速使用tcp server开发项目,特地从工作中总结出来如下TCP Server示例程序,可供大家参考。socket_server.c#include <stdio....原创 2019-05-27 23:53:40 · 789 阅读 · 0 评论 -
gcc编译时定义宏
在代码中经常可以看到条件编译语句,其结构大致如下所示:#ifdefTEST(语句块1)#else(语句块2)#endif如上条件宏语句意思为,如果定义了TEST宏,则执行语句块1,否则执行语句块2。那么如何定义TEST宏呢?只需要编译时添加-D选项就即可: -DTEST表示定义TEST宏示例代码:#include <stdio.h>int main...原创 2019-05-20 23:00:49 · 3170 阅读 · 0 评论 -
FTP文件上传、下载(基于curl库 )
在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,如下为通过curl命令上传、下载ftp文件的用法:# curl -T upload_test.txt -u fangye:fangye ftp://192.168.10.105/ //下载ftp文件 -u 账号:密码更多curl命令用法参考博客: https://blog.csdn.net/gubenpeiyua...原创 2019-01-16 23:42:24 · 2482 阅读 · 0 评论 -
Linux下libcurl的编译和交叉编译
1、下载curl源码因为从github上直接clone下来的源码需要通过configure.ac 和 Makefile.am 等文件来生成configure脚本,比较麻烦。推荐直接下载curl源码,工程自带configure脚本,可以直接使用。下载地址:https://curl.haxx.se/download/,此处我选择了最新的7.63.0版本。若是从github上直接clo...原创 2019-01-16 00:08:25 · 5765 阅读 · 0 评论 -
C语言常用时间函数
1、函数 time_t time(time_t *t); 终端输入:# man 2 time功能:获取从 1970-01-01 00:00:00 +0000 (UTC) 到现在经过了多少秒。用法:通过参数获取,如果传入的参数为空,则通过返回值获取。(time_t实际上就是long int类型)所需头文件:#include <time.h>2、函数 double ...原创 2019-01-03 17:14:32 · 5624 阅读 · 0 评论 -
Linux串口测试程序及使用总结
参考博客:https://blog.csdn.net/w282529350/article/details/7378388本程序通过传参的形式,指定串口设备节点和波特率,将串口接收到的数据原模原样的再发送出去,用来测试串口工作是否正常。同时该示例程序也为以后linux使用串口时做参考。如下代码亲测可用,由于使用了线程循环读数据存放到串口缓冲区,编译时需要链接-lpthread库 。/...原创 2018-12-28 22:31:25 · 4329 阅读 · 0 评论 -
linux链表list_head的基本原理及使用
1、list_head结构原型struct list_head{ struct list_head *next,*prev;};此结构体构成的链表为双向循环链表。该结构体在linux内核中被大量引用,几乎所有内核当中需要构成链表结构的地方都用到了这个结构体。例如内核的总线设备就用到了这个结构体。2、头结点的创建及初始化struct list_head head =...原创 2018-12-17 23:29:07 · 1614 阅读 · 0 评论 -
cJSON使用总结
JSON是一种轻量级的数据交换格式,而cJSON是用C语言编写的Json解析器。cJSON使用简单,只需添加cJSON.h 和 cJSON.c两个文件,编译时链接数学库(-lm)即可使用。cJSON下载:https://sourceforge.net/projects/cjson/一、cJSON结构体/* The cJSON structure: */typ...原创 2018-12-27 23:59:21 · 833 阅读 · 0 评论 -
memmove函数的使用
C语言中内存拷贝函数使用得非常广泛,最为常用的就是memcpy了,但是值得注意的是:memcpy拷贝的两个块地址不能有交叉重叠,否则可能会导致拷贝结果出错。查看memcpy用法,其中描述明确指出内存区域不得重叠,若内存区域有重叠,需要使用memmove函数。查看memmove用法,与memcpy用法相同,但是能够保证内存重叠后拷贝结果准确。该博客对两种函数的实现做了详细举例:h...原创 2018-12-20 21:50:10 · 1003 阅读 · 0 评论 -
zeromq发布-订阅模式简单使用
zeromq作为网络通讯库,是支持发布、订阅机制的,但是又与MQTT等发布、订阅概念有所不同。由于ZMQ通讯是基于CS模型的,没有服务程序做中转,也就意味着订阅端作服务端和发布端作服务端是不同的。如下图所示,每个框表示一个进程,zmq发布、订阅机制有如下性质:服务程序作发布者 只能跟作订阅者的客户端程序通信,服务程序作订阅者只能跟作发布者的客户端程序通信。订阅者作客户端,只能跟一个...原创 2018-12-06 20:00:52 · 5928 阅读 · 0 评论 -
基于C语言实现HTTP POST 表单形式上传文件
最近在C语言项目开发中,需要用到了http上传文件,又不想用curl库,于是打算基于socket用C语言实现,也正好研究一波表单上传形式。 1、首先写一个上传文件html文件: file.html<!DOCTYPE><html> <head> <meta charset="utf-8"> <title&...原创 2018-12-03 23:14:18 · 17418 阅读 · 20 评论 -
Ubuntu下利用cmake编译zeromq库
最近项目用到zeromq库作进程通信消息中间件,在网上找了一些编译方法都是使用autogen.sh 和 ./configure,使用这些方法还要依赖一些东西,比较麻烦。后面发现使用cmake更加方便简单,动态库和静态库都可以编译出来。如下为我的编译环境和编译步骤:当前zeromq版本:4.3.0cmake 版本: 3.5.1git 版本: 2.7.4测试平台:Ubuntu 1...原创 2018-12-06 00:07:00 · 1812 阅读 · 0 评论 -
linux中gdb调试器的简单使用(图文)
在ARM、Linux平台开发C/C++项目时,多多少少会遇到一些程序上的bug。小工程还好,如果是个大工程,代码量又大,就很难定位问题了。这时候使用gdb调试器便能轻松的帮忙定位代码bug。一、使用方法如下为示例代码:在编译代码的时候,加上调试选项 -g,如下所示:gcc -g test.c -o test利用gdb调试器来运行程序:gdb <可执行...原创 2018-12-25 23:45:27 · 2151 阅读 · 2 评论 -
INI配置文件的读写
INI文件是Initialization File的缩写,即初始化文件。一个程序往往需要根据不同的环境以不同的参数运行程序,通常采用从配置文件读取参数的方法来达到这一目的,而INI文件就是一个比较简单、好用的配置文件格式。INI文件由节、键、值组成。 节 [section] 参数(键=值) name=value 优点:简单、方便、可读性好...原创 2019-01-10 22:20:05 · 895 阅读 · 0 评论 -
gcc编译过程总结
gcc 1.c -o 1 整合编译程序,直接得到可执行文件。实际上可分为四步:预处理,编译,汇编,链接 预处理:将源文件中所有伪指令(#开头的指令,头文件和宏),给替换成为真正可以执行的代码。 gcc -E xx.c -o xx.i 编译:将源文件中所有的语法错误,代码写法规范,进行解析,同时将预处理生成的...原创 2018-12-27 00:37:43 · 297 阅读 · 0 评论 -
基于C语言的线程通信消息队列实现
在多线程编程中经常需要进行线程与线程间的通信,由于线程间能够共享数据结构,也就是一个全局变量能够被两个线程同时候使用。但是要注意的是线程的同步和互斥。 线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。 线程互斥是指当有若干个线程都要使用某一共享资源时,任...原创 2019-01-09 22:46:20 · 9472 阅读 · 5 评论 -
C/C++调用sqlite3接口详解
sqlite3的C/C++接口用法可分为两种:回调形式与非回调形式。所谓回调形式其实就是通过回调的方式处理sql语句执行结果,非回调形式就是待sql语句执行完毕后再通过返回值和相关函数来判断、获取执行结果。一、sqlite3非回调形式接口用法1、sqlite3_open 打开sqlite3数据库的连接 在sqlite3数据库管理系统中,用结构体sqlite3来表...原创 2019-01-15 00:04:50 · 20498 阅读 · 2 评论 -
数据库sqlite3简介学习
1、数据库(DataBase)与数据库管理系统(DBMS: DataBase Management System) 数据库,简单来说可视为电子化的文件柜--存储电子文件的处所,用户可以对文件中的数据进行新增、截取、更新、删除等操作。数据库指的是以一定方式存储在一起,能为多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。 数据库管理系统(DBMS)是为数据库而设计的...原创 2019-01-15 00:07:56 · 978 阅读 · 0 评论 -
kfifo学习及其使用示例
内核代码中有许多值得借鉴的地方,kfifo设计的非常巧妙,代码很精简,对于入队和出对处理的出人意料。当只有一个读线程和一个写线程并发操作时,可以确保是线程安全的,不用添加额外的锁来使用这些功能。kfifo的这一特性,提高了kernel的并发效率。所以kfifo适用于一个线程存数据,一个线程取数据的应用场景。kfifo结构体:struct kfifo{ unsign...原创 2019-01-23 23:39:10 · 8545 阅读 · 13 评论 -
zlog的安装与使用
最近在C语言开发的项目中需要建立一个比较完善的日志系统,方便研发及后期维护管理。于是就找到了zlog,zlog是一个高可靠性、高性能、线程安全、灵活、概念清晰的纯C日志函数库。其优势及详细用法直接看手册(zlog使用手册中文版): http://hardysimpson.github.io/zlog/UsersGuide-CN.html若链接进不去可自行下载:https://...原创 2019-01-07 23:12:43 · 20485 阅读 · 9 评论 -
HTTP Post请求天气信息(基于curl库 )
通过curl命令进行http post带参数请求:# curl -d "参数" "url"若在body中上传json参数,如下所示:# curl -H "Content-Type:application/json" -X POST --data (json.data) URL如下示例:以http post方式查询长沙的天气 基于curl库实现http post请...原创 2019-01-17 22:52:02 · 2322 阅读 · 1 评论 -
大小端模式概念梳理及区分方法
大小端模式这个概念,之前就有了解过,记得还写过一个测试程序(借助联合体打印出来的值来判断)来检测机器是大端模式还是小端模式。但是每次遇到具体问题时总是无法区分哪个是大端、哪个是小端。如下是百度百科对大小端的定义: 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加...原创 2019-01-03 00:46:10 · 388 阅读 · 0 评论