libevent,一个非常好的c的网络库,最近开始学习并分析下,做个记录。源码选用的1.4版本。因为感觉这版的代码比较精简,也没有太多宏定义,个人感觉适合学习原理。
从哪里开始呢,我选择从一些最简单的基础的东西开始,由简入繁。
今天就带来libevent的最小堆生成,体会下libevent作者如何实
C语言中的void 和 void * 总结
1、void的作用
c语言中,void为“不确定类型”,不可以用void来声明变量。如:void a = 10;如果出现这样语句编译器会报错:variable or field ‘a’ declared void。
在C语言中void 常常用于:
首先,我们在每次学习一门课程时,都有这样的习惯,即阅读目录,了解本门课程所需要学习的范围和内容,对课程有着整体的把握。之后,在对本门课程进行学习时,就会有一种把控全局的感觉,不管学到哪,都会大体知道这一部分在知识体系里的作用和功能,也就更好的理解了知识的前因后果、来龙去脉。所以,在学习C语言之前
回声客户端:
1.所谓“回声”,是指客户端向服务器发送一条数据,服务器再将数据原样返回给客户端,就像声音一样,遇到障碍物会被“反弹回来”。
2.客户端也可以使用 write() / send() 函数向服务器发送数据,服务器也可以使用 read() / recv() 函数接收数据
#define
struct sockaddr_in serv_addr;
1.定义结构体变量,结构体是一种数据类型,那么就可以用它来定义变量
2.struct 结构体名 变量名;
(struct sockaddr*)&serv_addr
1.结构体指针,指针也可以指向一个结构体
2.强制类型转换的格式
typedef void( *sighandler_t)(int);
1.用typedef给类型起一个别名。
2.为函数指针类型定义别名,
3.函数指针(指向函数的指针)
sighandler_t signal(int signum, sighandler_t handler);
1.函数原型
https://www.cnblogs.com/ggzss/archive/2011/08/18/2145017.html
assert是一个宏定义,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
1 #include <assert.h
static存储类型可以用于全部变量,无需考虑变量声明的位置。但是作用于块外部和块内部时具有不同的作用。
(1)当作用于函数内部时,和每次程序离开所在块就会丢失值的自动变量不同,static变量会保存下去,块内的static变量只会在程序执行前进行一次初始化,而自动
本文同时发表在 https://github.com/zhangyachen/zhangyachen.github.io/issues/123
写一下fopen/getc/putc等C库的粗略实现,参考了K&R,但是有几点根据自己理解的小改动,下面再具体说一下^_^
写这篇文章主要是帮助自己
十六进制数和十进制数类似,以小数点为界,整数部分从低位到高位依次是0次方位、1次方位、.、n次方位;小数部分从高位到低位依次是-1次方位、-2次方位、.、-m次方位.都可用加权求和的方式表示.十六进制数转换成十进制数时,先用加权求和的方式表示出来,再将十六进制数中的基数“10H”替换成对应的十进制数
Description
输入一个正整数n,求有几对素数x,y,满足n=x+y((3,2)和(2,3)视为相同的素数对)。
Input
有多组数据,每行输入一个偶整数n(3<n<32768)。n等于0时,输入结束。
Output
输出相应的答案。
Sample Input
6 10 12
一、PTA实验作业
题目1:查验身份证
1. 本题PTA提交列表
2. 设计思路
定义i,flag=1,z,m[11],a[19]
输入次数n
for i=1 to n+1
gets(a)
加权求和在取余计算z
switch(z)
对应查看a[17]与校验码是否一致
守护进程:
必须是init进程的子进程,运行在后台,不与任何控制终端相关联。
通过以下步骤成为守护进程
1.调用fork()创建出来一个新的进程,这个新进程会是将来的守护进程
2.在新守护进程的父进程中,调用exit(),为了守护进程的爷爷进程确认父进程结束
3.在新守护进程中,调用setsid()
1.等待终止的子进程(僵死进程):
如果一个子进程在父进程之前结束,内核会把子进程设置为一个特殊的状态,处于这种状态的进程称为僵死进程
当父进程获取了子进程的信息后,子进程才会消失。
pid_t wait(int *status);
父进程调用这个方法会被阻塞住,如果子进程终止的时候,此方法会调用并
1.Visual C++6.0的下载
本书中使用的Visual C++6.0的中文版,读者可以在网上搜索,下载合适的安装包。
2.Visual C++6.0的安装
Visual C++6.0的具体安装步骤如下:
(1)双击打开Visual C++6.0安装文件夹中的SETUP.EXE安装文件,如图1
ASCII表中的有些字符是打印不出来的,那么怎样表示这些无法打印的字符呢?
C提供了3种表示方法.
一: 直接使用ASCII码
二: 使用特殊的符号序列, 即转义字符.
三: C90支持使用十六进制形式表示字符常量.(在这种形式中,反斜杠后跟一个x或X,再加上1到3位十六进制数字)
转义字符
一、指针
指针就是地址,指针变量是用来存放地址的变量,把谁的地址存放在指针变量中,就说此指针变量指向谁。
二、数组
1.一维数组
一维数组名代表数组首元素的地址,因此 *a=a[0];
&:取地址运算符。&a 是变量 a 的地址
*:指针运算符,*p 代表指针变量p指向的对象
1) 编写算法函数int equal(tree t1, tree t2),判断两棵给定的树是否等价;
1 int equal(tree t1,tree t2)
2 {
3 int k;
4 if(t1==NULL&&t2==NULL)
5
一、PTA实验作业
题目1:找鞍点
1. 本题PTA提交列表
2. 设计思路
定义n,i,j,ii,jj,a[7][7],flag,max
输入n
for i=0 to i=n
for j=0 to j=n
读入二维数组 end
for i=0 to i=n max=0,f
Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。
实现方式:
container_of(ptr, type, member)