
c语言
文章平均质量分 70
化茧成蝶007
从事Linux下的开发,熟悉shell,Python,c++,c,目前学习qt开发
展开
-
linux 配置文件读写解析
有时我们自己写Linux下配置文件,需要手动解析,然后使得程序可以配置的类似于以下格式 simple.conf: ## Sample configuration file ip=192.16.31.2port=22Desktop-Picture = /usr/images/earth.jpg Position = Centered直接上代码解析:头文件ccl.h#ifndef CLL...原创 2018-03-21 20:52:03 · 5943 阅读 · 1 评论 -
getopt_long 函数详解
文件#include 函数原型int getopt_long(int argc, char * const argv[],const char *optstring,const struct option*longopts, int *longindex);函数说明getopt被用来解析命令行选项参数。getopt_long支持长选项的命令行解析,使原创 2017-08-28 22:48:31 · 1620 阅读 · 1 评论 -
C语言 输入
流流是什么?形象的比喻——水流,文件和程序之间连接一个管道,水流就在之间形成了,自然也就出现了方向:可以流进,也可以流出。便于理解,这么定义流: 流就是一个管道里面有流水,这个管道连接了文件和程序。UNIX系统认为一切皆文件,所有的外部设备都被看做文件。C语言系统定义了三个默认的文件指针:1、stdin 即标准输入文件,与键盘连接。(即把键盘当做文件)2、std原创 2017-08-23 23:51:38 · 397 阅读 · 0 评论 -
C语言 类型转换
类型转换在 C 语言的表达式赋值时,要小心背后默默的隐式类型转换,它们会导致隐藏的 Bug。C语言的整型提升规则C的整型算数运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符型和短整型操作数在使用之前被转换为普通整型。例:char a,b,c ;a = b+c ;注意,根据整型提升规则,上面b和c的值被提升为普通整型,原创 2017-08-23 23:05:58 · 261 阅读 · 0 评论 -
C语言 函数指针
函数指针函数指针就是函数的指针。它是一个指针,指向一个函数。(即函数在内存中的起始位置地址)实际上,所有的函数名在表达式和初始化中,总是隐式地退化为指针。例:int r , (*fp)( ) , func( ) ;fp= func ; //函数名退化为指针r= (*fp)( ) ; //等价于r=fp( ) ;无论fp是函数名还是函数指针,都能正确工作。因为原创 2017-08-23 22:28:32 · 231 阅读 · 0 评论 -
C语言 数组与指针(二)
数组与指针的纠葛在C语言中,根据定义,表达式 e1[e2] 准确地对应于表达式 *((e1)+(e2))。因此,要求表达式 e1[e2] 的其中一个操作数是指针,另一个操作数是整数。且这两个操作数的顺序可以颠倒。故: a[4] 等同于 4[a] 等同于 *(a+4)*编译器把所有的e1[e2]表达式转换成 \((e1)+(e2))。所以,以下标的形式访问在本质上与以指针的形原创 2017-08-23 22:15:06 · 263 阅读 · 0 评论 -
\r 和 \n 和 \r\n的区别是?
#include #include int main(){ printf("hello world\n"); printf("hello\rworld\n"); printf("hello\r\nworld"); printf("hello world\r\n"); return 0;}原创 2017-08-27 22:58:23 · 412 阅读 · 0 评论 -
C语言 数组与指针(一)
数组与指针(一)指针是 C 的精华,如果未能很好地掌握指针,那 C 也基本等于没学。先附上两句话:第一句话:指针就是存放地址的变量。(就是这么简单。)第二句话:指针是指针,数组是数组。(只是它们经常穿着相似的衣服来逗你玩罢了。)轻松一下:(见识一下数组和指针的把戏)1、引用一维数组某个值的方式:(先定义指针p=a)a[2]*(a+2)(&a[原创 2017-08-22 23:21:32 · 416 阅读 · 1 评论 -
Gcc 编译的背后
前言平时在 Linux 下写代码,直接用 gcc -o out in.c 就把代码编译好了,但是这背后到底做了什么呢?如果学习过《编译原理》则不难理解,一般高级语言程序编译的过程莫过于:预处理、编译、汇编、链接。gcc 在后台实际上也经历了这几个过程,可以通过 -v 参数查看它的编译细节,如果想看某个具体的编译过程,则可以分别使用 -E,-S,-c 和 -O,对应的后台工具原创 2017-08-22 21:58:51 · 468 阅读 · 0 评论 -
链接03
讲解的很不错===值得学习GCC 编译的背后http://www.tinylab.org/behind-the-gcc-compiler/转载 2017-08-26 00:30:54 · 225 阅读 · 0 评论 -
ELF 主体:节区02
下面来看看 ELF 文件的主体内容:节区(Section)。ELF 文件具有很大的灵活性,它通过文件头组织整个文件的总体结构,通过节区表 (Section Headers Table)和程序头(Program Headers Table 或者叫段表)来分别描述可重定位文件和可执行文件。但不管是哪种类型,它们都需要它们的主体,即各种节区。在可重定位文件中,节区表描述的就是各种节区本身转载 2017-08-26 00:06:04 · 583 阅读 · 0 评论 -
va_start(),va_end()函数应用
原理解释:VA_LIST 是在C语言中解决变参问题的一组宏,在头文件下。VA_LIST的用法: (1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针 (2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。 (3)然后用VA_AR转载 2017-08-14 23:31:10 · 164 阅读 · 0 评论 -
ELF 文件的结构01
目标代码不再是普通的文本格式,无法直接通过文本编辑器浏览,需要一些专门的工具。如果想了解更多目标代码的细节,区分 relocatable(可重定位)、executable(可执行)、shared libarary(共享库)的不同,我们得设法了解目标代码的组织方式和相关的阅读和分析工具。下面主要介绍这部分内容。BFD is a package which allows applica原创 2017-08-25 23:56:13 · 217 阅读 · 0 评论 -
关于setvbuf()函数的详解
为什么要使用setvbuf函数 如果你的内存足够大,可以把文件IO的BUF设置大一些,这样每次你用fopen/fread/fwrite/fscanf/fprintf语句的时候,都会在内存里操作,减少内存到磁盘IO读写的操作次数,提高系统效率。 如果你的程序的功能涉及到类似数据库、视频、音频、图像处理等大量需要爆发式磁盘到内存的IO情况下,可以考虑用setvbuf进行优化内存IO,其原创 2017-08-29 23:15:08 · 8326 阅读 · 0 评论 -
fscanf 函数详解
fscanf位于头文件stdio.h>中,函数原型为int fscanf(FILE*stream, constchar*format, [argument...]); 其功能为根据数据格式(format)从输入流(stream)中写入数据(argument);与fgets的差别在于:fscanf遇到空格和换行时结束,注意空格时也结束,fgets遇到空格不结束。返回值:整型,成功返回读入的参原创 2017-08-29 23:29:19 · 756 阅读 · 0 评论 -
【源码剖析】Webbench —— 简洁而优美的压力测试工具
Webbench 是一个古老而著名的网站压力测试工具,简单而实用。如果你不清楚你的网站能承受多大的压力,或者你想分析对比两个网站的性能,webbench 再好用不过了。安装: 很简单,cd 进项目主页后进行 make install clean 就好了。 用法: 想要知道用法可以在安装后直接输入 webbench 或 webb转载 2017-08-29 23:45:57 · 677 阅读 · 0 评论 -
libpng使用
最近看到一片关于如何使用C语言读和写png图片格式我要讲的三个大部分分别是:1、libpng是什么,能做什么?2、怎样让自己的程序可以使用libpng库?3、怎样借助libpng读写PNG文件1、libpng是什么?libpng是一款C语言编写的比较底层的读写PNG文件的跨平台的库。借助它,你可以轻松读写PNG文件的每一行像素。因为PNG文件是经过压缩而且格式复转载 2018-01-11 16:01:09 · 18838 阅读 · 4 评论 -
git 指令使用总结
git使用用户手册1、查看配置 git config -l查看不同级别的config2、git配置文件分类--system 系统级--global 全局--local当前项目注意:对于同一配置项,三个配置文件的优先级是13、设置用户名与邮箱(用户标识,必要)git config --global user.name "gaozhen"git c原创 2017-12-30 22:35:06 · 264 阅读 · 0 评论 -
C语言结构体的对齐方式
1、临界区公用资源,某一时刻只能被一个多线程访问,有线程进入后,其他线程必须等待2、互斥量和临界区很相似,只有拥有互斥对象的线程才能访问资源,互斥对象只有一个,所以某一刻只有一个线程可以访问 互斥量比临界区复杂,因为使用互斥可以在同一应用不同线程间访问,也可以在不同应用之间访问 创建 打开 释放 等待 3、允许同一时刻多个线程进行共享资源原创 2017-12-30 22:29:48 · 268 阅读 · 0 评论 -
临界区 互斥量 信号量 事件
1、临界区公用资源,某一时刻只能被一个多线程访问,有线程进入后,其他线程必须等待2、互斥量和临界区很相似,只有拥有互斥对象的线程才能访问资源,互斥对象只有一个,所以某一刻只有一个线程可以访问 互斥量比临界区复杂,因为使用互斥可以在同一应用不同线程间访问,也可以在不同应用之间访问 创建 打开 释放 等待 3、允许同一时刻多个线程进行共享资源原创 2017-12-30 22:28:28 · 273 阅读 · 0 评论 -
8个Linux必背常用指令,立马熟悉Linux
1、cat 连接文件 并输出结果2、sort文件里的文字按行排序3、grep打印出匹配条件的文字行4、cut删除文件中字符行上的某些区域5、uniq删除重复行6、sed用来输入流上执行基本的文本变换7、find在文件目录中搜索文件8、less原创 2017-12-30 21:37:01 · 998 阅读 · 0 评论 -
framebuffer 保存png, bmp图片
遇到一个需求,在读取/dev/fb0的原始数据并保存为bmp,png图片,并通过命令行格式进行保存. 写的不好,大家可以指点出来,一起讨论. root@imx6qsabresd:~# ./imx6_shot -h usage: ./imx6_shot [-hpb] [FILENAME] imx6 [option]... -p|--png原创 2017-12-15 11:31:38 · 1598 阅读 · 0 评论 -
嵌入式系统平台,读取framebuffer保存为png图片
#include #include #include #include #include #include #include #include #include #include static int Blue = 0;static int Green = 1;static int Red = 2;static int Alpha = 3;int main(int原创 2017-12-14 14:27:39 · 1405 阅读 · 2 评论 -
解决SDL/SDL.h: No such file or directory的方法
一、先安装一些依赖包先简单再介绍一下SDL:SDL是Simple DirectMedia Layer(简易直控媒体层)的缩写。它是一个跨平台的多媒体库,以用于直接控制底层的多媒体硬件的接口。主要用在开发游戏上!Ubuntu的新得立已经包含SDL库,所以通过几个简单的命令就可以安装,比windows还傻瓜!sudo apt-get install libsdl1.2-dev(比较大,原创 2017-12-04 14:29:08 · 22787 阅读 · 1 评论 -
framebuffer 保存 bmp图片格式
最近需要完成一个从framebuffer中进行读取,然后将内存的东西保存为bmp图片格式,我的其他博客内容对framebuffer进行详细的讲解,以及bmp的格式进行详细的讲解。 之前从网上看到了一些保存bmp图片的代码,在本地执行都会出现文件,本人就进行了自己编写, 也可以从github中获取源码:直接看代码:https://github.com/Guazhen/Fra原创 2017-12-08 15:23:05 · 1984 阅读 · 0 评论 -
队列的简单实现--C语言
#include struct queue{ int data[100]; //存数据 int head;//头结点下标 int tail;//尾节点下标};int main(){ struct queue q; int i; q.head = 1;原创 2017-11-02 21:04:30 · 655 阅读 · 0 评论 -
suricata 源码详细讲解
从main函数开始https://my.oschina.net/openadrian/blog/184621原创 2017-08-31 11:14:04 · 1733 阅读 · 0 评论 -
C语言程序可以没有main函数
学习C语言的同学都知道,每个C程序要有一个main函数,程序从main函数开始执行,在main函数中结束。但事实上,C程序也可以没有main函数,或者说自己可以指定入口函数。下面这篇文章介绍了如何实现这一过程。这篇文章转自:http://www.codeweblog.com,作者不详。学习这个内容对程序设计没啥影响,但能更深入地了解程序编译和链接的原理。 这篇文章主要介绍了转载 2017-08-31 10:56:56 · 1113 阅读 · 0 评论 -
readelf命令详解
readelf命令用来显示一个或者多个elf格式的目标文件的信息,可以通过它的选项来控制显示哪些信息。这里的elf-file(s)就表示那些被检查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文档(这里一般指的是使用ar命令将一些elf文件打包之后生成的例如lib*.a之类的“静态库”文件)。 这个程序和objdump提供的功能类似,但是它显示的信息更为具体,并且转载 2017-08-25 23:05:49 · 1566 阅读 · 0 评论 -
Gcc 编译的背后--预处理
预处理简述预处理是 C 语言程序从源代码变成可执行程序的第一步,主要是 C 语言编译器对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。以前没怎么“深入”预处理,脑子对这些东西总是很模糊,只记得在编译的基本过程(词法分析、语法分析)之前还需要对源代码中的宏定义、文件包含、条件编译等命令进行处理。这三类的指令很常见,主要有 #define,#incl原创 2017-08-25 22:43:05 · 587 阅读 · 0 评论 -
C 命令行参数
C 命令行参数执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当您想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。命令行参数是使用 main() 函数参数来处理的,其中,argc 是指传入参数的个数,argv[] 是一个指针数组,指向传递给程序的每个参数。下面是一个简单的实例,检查命令行是否有提供参数,并根据参数执行原创 2017-08-21 23:09:10 · 902 阅读 · 0 评论 -
进程间同步
互斥量mutex进程间也可以使用互斥锁,来达到同步的目的。但应在pthread_mutex_init初始化之前,修改其属性为进程间共享。mutex的属性修改函数主要有以下几个。主要应用函数: pthread_mutexattr_t mattr 类型: 用于定义mutex锁的【属性】 pthread_mu原创 2017-08-06 20:10:13 · 327 阅读 · 0 评论 -
线程同步---信号量
进化版的互斥锁(1 --> N) 由于互斥锁的粒度比较大,如果我们希望在多个线程间对某一对象的部分数据进行共享,使用互斥锁是没有办法实现的,只能将整个数据对象锁住。这样虽然达到了多线程操作共享数据时保证数据正确性的目的,却无形中导致线程的并发性下降。线程从并行执行,变成了串行执行。与直接使用单进程无异。 信号量,是相对折中的一种处理方式,既能保证同步,数据不原创 2017-08-06 19:27:33 · 248 阅读 · 0 评论 -
线程同步-----条件变量
条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。主要应用函数: pthread_cond_init函数 pthread_cond_destroy函数 pthread_cond_wait函数 pthread_cond_timedwait函数 p原创 2017-08-06 18:58:15 · 285 阅读 · 0 评论 -
C语言中的 (void*)0 与 (void)0
前几天看到一个宏, 它大概是这样的: #define assert_param(expr) ((expr) ? (void)0 : assert_failed((u8 *)__FILE__, __LINE__)) 代码的含意简单, 关键是那个 (void)0 的用法, 我还是第一次见到(别笑). 我用 void 的时候, 有两种情况: 1.放到函数前面,转载 2017-08-20 08:14:46 · 7488 阅读 · 3 评论 -
C 共用体
共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。定义共用体为了定义共用体,您必须使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:union [union tag]原创 2017-08-19 21:53:47 · 226 阅读 · 0 评论 -
位域
有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"或"位段"。所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字原创 2017-08-19 21:35:42 · 271 阅读 · 0 评论 -
C 存储类
auto 存储类auto 存储类是所有局部变量默认的存储类。{ int mount; auto int month;}上面的实例定义了两个带有相同存储类的变量,auto 只能用在函数内,即 auto 只能修饰局部变量register 存储类register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量原创 2017-08-19 20:45:25 · 356 阅读 · 0 评论 -
C语言读写文件
C-File I/O 文件的I/O操作是每一门语言的重点,因此这里我先来介绍一下如何用C语言去进行文件的I/O操作。文件和流 就C语言程序而言,所有的I/O操作只是简单地从程序移进或移出字节的事情。因此,这种字节流便被称为流(stream)。程序只需要关心创建正确的输出字节数据,以及正确地解释从输入读取的字节数据。特定I/O设备的细节对程序员是隐藏的。绝大多数流是完转载 2017-08-12 21:11:32 · 242 阅读 · 0 评论 -
全局变量在头文件中“定义”
看着标题,定义上面加了一个引号,这个得注意了。怎么解释呢,一般而言,变量只能定义在.c文件中,声明变量才在.h文件中。下面就打破常规,把定义变量的语句放在.h文件中,但是对实际而言,变量定义在头文件中是表面上的。 下面直接给出代码,有三个文件a.h a.c main.c:a.h里面的代码:[csharp] view plain转载 2017-08-19 10:04:22 · 783 阅读 · 0 评论