- 博客(37)
- 收藏
- 关注
原创 用c实现一个阻塞的消息队列
该消息队列的实现,完全是符合posix标准。实现了1.读时,队列空,会阻塞2.写时,队列满,会阻塞为了保证线程安全,采用了互斥量,为了阻塞一定时间,采用了条件变量,二者一起用,实现了一个简单消息队列simple_queue.c#include#include#include#include#include#include"simple_queue.h"pthr
2018-01-10 10:44:04 5980 5
原创 select/poll/epoll函数的区别
1.多路IO复用监测多个事件,一旦某个事件发生了,就进行相应的处理select、poll、epoll就是实现了这个机制,但是实现一些区别2.select、poll函数这2者的差别不太,都有一些性能上的弊端,select函数是监测的文件描述符有限制(用数组保存需要监测的文件描述符),poll函数没有(用链表保存)刚刚说到性能上的弊端监测的文件描述符要在内核和用户空间之间...
2018-10-12 09:39:44 674
原创 libevent分析和使用
1.libevent介绍libevent是一个轻量级的基于事件驱动的高性能的开源网络库,支持多种系统,对不同系统的函数进行再次封装统一接口,编译的时候,选择自己的系统就行了因为libevent的出色的轻量级、高性能的表现,很多其他的开源库基于此库,开发出了适应更多场景的开源库 例如memcached,在libevent上面增加了多线程的支持,主要利用了主线程+多个工作线程,实现线程池...
2018-10-11 16:03:47 576
原创 Linux驱动入门
1. 什么是驱动程序驱动程序是操作系统和硬件中间的一个抽象层,Linux把所有的设备都抽象成文件,驱动程序屏蔽各个硬件设备差异,提供统一的接口,利于上层开发驱动程序编写主要是通过查看外设芯片手册,根据手册完成设备的初始化、读写、控制等一系列函数的编写2.编写驱动程序准备驱动程序可以和内核一起编译,也可以用动态加载的方式1.Linux环境的搭建(利用虚拟机,安装Linux一...
2018-09-26 11:37:20 743
原创 void和void*以及NULL、0和'\0'
1.void和void*void:主要是声明函数没有返回,函数没有参数,void不能修饰变量void*:表示一个"无类型"的指针, 无类型的指针可以包容所有其他有类型的指针,有类型指针不包容其他指针void*指针可以接纳一切指针,但是void*指针赋给有类型指针,也要强制类型转换有类型的指针之间进行赋值的时候需要强制类型转换void*指针不支持加法和减法操作(大部分系统,有些...
2018-09-06 09:51:58 866
原创 strcpy、strncpy、memcpy、memmove之间的区别和实现
1.函数声明char* strcpy(char *d_s, const char *s_s);char* strcpy(char *d_s, const char *s_s, size_t n);void* memcpy(void *d_s, const void *s_s, size_t n);void* memmove(void *d_s, const void *s_s, s...
2018-09-05 16:54:13 608
原创 callback函数详解
在项目中经常会看到一些callback函数,callback函数实现了用户自定义处理主要表现在C语言的面向对象编程、异步处理C语言中的callback函数的实现,主要是利用了函数指针废话不多说,直接贴代码#include<stdio.h>#include<string.h>typedef struct{ int calc_max; int cal...
2018-08-30 10:32:23 4660
原创 git教程
git是一个分布式版本控制系统,svn是集中式版本控制系统git是Linux之父Linus开发出来的(喝水不忘挖井人)GitHub的出现,让git正真大火,GitHub为很多开源项目提供git存储,GitHub是所有软件开发人员都喜欢的地方集中式:有一个中央服务器,版本库存放在中央服务器,最蛋疼是提交的时候,需要联网,不能离线工作分布式:一般也有中央服务器,这个服务器主要是为了方便...
2018-08-29 18:36:11 425
原创 tcp和udp的区别
1.最大的区别tcp是可靠的、面向连接的协议,udp是不可靠、非连接协议,这个区别决定了2者的其他的区别连接就像是打电话,非连接就像邮局寄信可靠是因为tcp有重传机制,当write时(假设缓冲区足够大),实际是写入缓冲区,只有当数据被另一方接收了(另一方回传了ack信号)时,才会把刚才发送的数据从缓冲区删除,不然就会重发2.字节流和数据报tcp是字节流,因为是连接的,1对1的通...
2018-08-28 14:57:47 811
原创 core dump文件的生成和使用
1.什么是core dump文件当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。2.如何生成core dump文件在...
2018-08-27 19:50:22 6443
原创 同步、异步、阻塞、非阻塞
1.经典答案同步和异步关注消息通信机制同步:发出一个调用,在没有得到结果之前,该调用不返回异步:调用发出之后,直接返回,不等待结果,被调用者会通过消息、状态来通知调用者或通过回调函数来处理这个调用阻塞和非阻塞关注程序在等待结果(消息、返回值)时的状态阻塞:调用结果在返回之前,线程会被挂起,调用线程只有在得到结果时才会返回非阻塞:不能立刻得到调用结果之前,调用不会挂起线程,而...
2018-08-27 15:07:52 179
原创 静态库和动态库使用详解
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此好用的轮子大家一起用。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库.a(win 系统下是lib)和动态库.so(win 系统下是.dll)。1.静态库和动态库的特点静态库:编译过程中已经被载入可执行程序,因此程序体积较大。共享...
2018-08-23 19:08:24 733
原创 lua调用c详解(Windows版+Linux版)
1.lua调用c的原理lua提供一个require函数,用来加载lua模块,lua模块分为lua写的模块和c写的模块,对于c写的模块,C模块在使用以前必须首先加载并连接,在大多数系统中最容易的实现方式是通过动态连接库机制,所以lua调用c,实际就是调用c程序打包成的so(Linux)和dll(Windows)lua环境搭建、lua和c怎么交换数据、以及虚拟栈的操作等,这些详情可以看我另外一...
2018-08-17 17:11:56 1314
原创 c调用lua详解(Windows版+Linux版)
1.c调用lua的实现原理lua语言是c语言实现的,而且是非常轻量级的,非常适合内存受限的嵌入式产品c调用lua,需要在c程序中模拟出lua解释器环境,所以需要调用lua的函数,即生成c程序必定要链接lua库,lua解释器和C是通过一个虚拟栈来交换数据的栈的大小可以设置,通过查看lua的源码,可以知道这个栈的大小,在luaconf.h的LUAI_MAXSTACK,还可以通过lua_...
2018-08-16 10:57:44 5276
转载 hpp头文件与h头文件的区别
hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。 ...
2018-08-15 16:38:50 37123 3
原创 stdafx.h到底有什么用
我发现自己养成了一个比较好的习惯,有关编程的事情,一定知其然知其所以然因为刚刚接触使用VS的时候,所以很多这个IDE的很多东西不清楚例如:在新建一个项目的时候,很多时候有stdafx.h,我就在想这个文件究竟是干什么的1.预编译头头文件夹下会默认有头文件stdafx.h,而源文件夹下则默认有源文件stdafx.cpp,手动将这些文件删除后,编译时系统还会报错stdafx.h并不...
2018-08-15 16:26:44 53882 3
原创 Makefile理论到实践
1.什么是Makefile工程按功能、模块把不同的文件放在不同的目录下面,当我们生成一个target的时候,需要知道生成这个target需要哪些文件,以及用什么方法生成,Makefile就是一个这样的文件,定义了一系列的规则,定义了这个target需要哪些依赖文件、生成的规则,Make命令工具还提供了变量、关键字、函数、支持调用shell命令,使得Makefile异常强大2.Makefil...
2018-08-12 23:47:56 264
原创 半小时深入理解各种字符编码
开始之前,先讲一个故事A国家里面,有甲、乙2个人,他们想在电脑上显示字符‘a’,甲认为用0101010来表示a,乙认为用1010101,A国家为了解决这个问题,有关部门经过研究自己所有用过的128字符,制定一个规则,认为用7位就可以表示所有的字符,并且认为a应该用1100001表示。无独有偶,B和C国家有同样的问题,但是B国家不止127字符而是256,并且包含A国家的128个字符,同时又想...
2018-07-23 19:22:47 294
原创 函数调用过程中的栈帧分析
说到函数调用和栈帧,就不得不提到另外一个名词“栈”,栈的主要特点:先入后出,后入先出(就像叠罗汉一样),增长的方向,高地址向低地址生长,系统自动回收我们都知道局部的自动变量都是存放在栈上面的,那么栈帧又是什么呢?栈帧首先是存储在栈上,栈帧记录过程调用的一些信息的,例如传入参数、函数的返回地址、函数的局部变量等,一个程序不止一个函数,很多时候都是函数的嵌套调用,那么栈上面肯定有多个栈帧(栈溢出因为栈...
2018-06-28 11:44:52 1576
原创 寄存器知识大杂烩
1.寄存器是什么寄存器是一个容器,一个存储信息的容器,和内存差不多,不过寄存器比内存更加稀有。寄存器有分为cpu中的寄存器和外设的寄存器,我们常常说的寄存器,一般是说cpu中的寄存器2.有哪些寄存器8086 cpu中的寄存器总共14个,且均为16位分别是AX BX CX DX SP BP SI DI IP FLAG CS DS SS ES,按照用处,分别分为通用寄存器、控制寄存器和段寄存器通用寄存...
2018-06-21 19:14:55 922
原创 gdb调试的入门技巧
gdb是Linux下单步调试的利器首先想要调试代码 必须要在编译的时候加上 -g,例如:gcc -g test.c -o test这个时候就在生成的可执行文件加入了调试信息怎么调试代码呢 gdb test (gdb加上需要调试可执行文件名)上面第一个图是我贴的用来测试的源代码,第二图是我开始调试的命令。可以看到 run(r)这个命令,这个命令是遇到断点会停止运行可以...
2018-06-19 13:52:52 254
原创 ubuntu修改主机名
首先查看主机名:可以看到主机名是Linux1. 临时的修改,重启之后会失效:这个时候可以重新打开一个终端,会发现新的主机名为test2. 永久修改主机名:可以vim /etc/hostname,当我试图修改的时候,会提示onlyread,因为非root用户只有读权限可以通过ls -l hostname查看文件的权限设置,不建议修改当前用户的权限,再去修改这个文件应该sudo su切换到root用户...
2018-03-26 16:26:24 373
转载 tcp三次握手和四次挥手
TCP建立连接三次握手和释放连接四次握手 【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/52535294 在谈及TCP建立连接和释放连接过程,先来简单认识一下TCP报文段首部...
2018-03-07 10:53:42 135
原创 osd的原理
OSD(On Screen Display)是屏幕显示技术的一种,用于在显示终端上显示字符、图形和图像。显存,也被叫做帧缓存,它的作用是用来存储显卡芯片处理过或者即将提取的渲染数据。如同计算机的内存一样,显存是用来存储要处理的图形信息的部件。我们在显示屏上看到的画面是由一个个的像素点构成的,而每个像素点都以4至32甚至64位的数据来控制它的亮度和色彩,这些数据必须通过显存来保存,再交由显示芯片
2018-03-05 10:50:52 17330 3
原创 宏函数、inline内联函数、普通函数的各自特点
实际只要知道宏定义普通用法就可以知道宏函数和自定义函数的区别了首先宏只是简单的进行替换,发生在预编译阶段知道这个可以慢慢推出来2者有何区别例如宏MAX((a), (b)) (a) > (b)? (a):(b) ---------1自定义函数int get_max(int a, int b){retu
2018-03-01 15:26:50 549
原创 Windows下开发的必备的脚本bat
在开发的时候,是不是有很多枯燥的重复、简单的工作,是不是很想从其中解脱出来,反正我是想从里面解脱出来bat里面有很多语法,有些语法看起来不顺眼,反正我觉得看起来没有c语法顺眼(bat是很强大的)初学者可以先学2个命令,学了之后,有利于测试自己写的batecho:显示这一条命令后面的字符pause:执行这一条命令之后,会暂停执行,并且再屏幕上显示“请按任意键继续...”先来看一个
2018-02-09 15:31:15 8631 2
原创 用Linux命令浅析C内存机制
有人会问,知道C语言的内存分配有什么用?有很大一部分人,对这些都不太懂,不是也写出了很多c代码吗?但是我要告诉你的是,不懂C语言的内存分配,不是一个好程序猿先上一张我在网上找的一张图这一张图内容有点多,只需要了解其中一部分即可(其实其他的我也不太清楚)text segment:可以理解为代码段,存储程序代码,其实就是机器指令,可读可执行,占程序文件大小data segment:可以理解数据...
2018-01-30 15:04:43 264
原创 ram rom flash eeprom ddr...这些都是什么鬼
这么多名词,有没有一脸懵逼,没关系,先让我们来看一张图有了上面这张图,是不是有了一个大概的认识了,再让我们深入的了解一下 RAM(random access memory):随机存取存储器,它能随时读写,而且速度很快,断电数据丢失,主要存储程序的临时数据RAM又分静态的RAM(SRAM)和动态的RAM(DRAM)SRAM :利用6个晶体管组成一个双稳态存储单元来保存信息,具...
2018-01-26 15:15:24 3140 1
原创 const、#define和volatile的总结
1.const:代表着只读,不允许被更改,但是有可能被其他程序更改(可以通过指针修改局部的const变量但是不能修改全局的)上面这个定义给人模糊的感觉,不防先看一个例子编译结果:可以看到编译的结果,显示max变量是read-only(只读)的,无法再次给该变量进行左值运算,但是把这个const变量的地址给一个指针,可以通过该指针来修改这个值。虽然可以做,但是程序员的使用这个...
2018-01-25 11:27:53 1118
原创 Ubuntu开机提示fsck exited with status code 4的解决办法
Ubuntu开机的时候会check磁盘,如果check fail,会提示sdax check fail(sdax为sda0 、sda1等等)这是因为关机不当导致磁盘内的数据损坏解决办法:fsck -y /dev/sdax(sdax为数据损坏的磁盘)等待数据修复之后,再关机重启即可
2018-01-23 16:34:48 10736 6
原创 C语言中#pragma的常用参数
#pragma是预处理指令,它的作用是设定编译器的状态或者只是编译器完成一些特定的动作,对每个编译器给出的方法都是不同,不太具有移植性。一般格式为:#pragma para1.message参数#pragma message(“文本消息”),遇到这个消息的时候,编译器在编译的时候就会打印出这条消息这个指令是比较好用和常用的,常常用来判断某个宏是否定义2.code_seg参数
2018-01-23 14:52:54 2799
原创 #line和#error的使用
#line number “file_name”:从下一行开始,__LINE__会从number开始计数,__FILE__会变成file_name字符串#line number:从下一行开始,__LINE__会从number开始计数注意:number是一个非负整数使用举例:运行结果:#error message:代码编译到当前行,会停止编译,并且会打印messa
2018-01-18 11:37:11 359
原创 strlen和sizeof的区别与总结
strlen是用来计算字符串的长度,遇到第一个NULL('\0')为止,不包括‘\0’。sizeof是用来计算变量或者对象、类型所占字节的多少。首先来看一个例子:char s1[] = "hello";char* s2 = "hello";char s3[10] = ''hello";sizeof(s1) = 5 strlen(s1) = 5...
2018-01-17 15:24:05 13096 7
转载 值得推荐的C/C++框架和库 (真的很强大)
值得学习的C语言开源项目- 1. Webbench Webbench是一个在Linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。下载链接:http://home.tiscali.cz/~cz210
2017-08-03 17:49:40 5181 4
原创 进程间的通信之消息队列
一、消息队列消息队列就是一个消息列表,用户可以在消息队列中添加消息、读取消息,并且还可以通过消息类型来发送和接收消息,这样就有了选择,而不是被动接收消息,并且消息队列的发送和接收可以独立存在而不会出现单独运行一个读/写进程而失败,还提供了同步机制。二、函数原型1.创建/打开消息队列int msgget(key_t key, int flag);key:只要独一无二就行,
2017-07-26 12:15:26 259
原创 进程间的通信之共享内存
一、共享内存 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间,这一块空间是内核专门提供给多个进程交换信息的。但是内核并没有实现对这个内存进行同步,必然需要某种同步机制,互斥锁和信号量都可以。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的
2017-07-25 11:06:21 545
原创 C语言的内存管理
当我们硬件资源很紧张的时候,内存的管理就显得尤为重要了。想对C语言的内存管理有个比较的好的了解,就让我先了解一下代码中那些东西与内存的关系最为直接、最为频繁,我的印象中,变量、函数与内存是分不开的。首先让我们来复习一下变量、函数的知识。一 变量的类型: 1. 全局变量:代码块之外的变量,全局变量一般是在.c中定义的,在.h用extern关键字声明的(定义只能是一次,声明是可以多
2017-01-12 09:22:05 628
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人