- 博客(20)
- 收藏
- 关注
原创 printf出现Segmentation fault
printf出现seg fault的场景很多,大多数是参数错误导致的。 例如下面这个:int a = 1;printf("%s\n", a);或者: printf("%s\n"); // 没有参数哦但是,我遇到了一个更加隐蔽的… 出现的场景是这样的: 我们的程序里面有一个这样的全局变量: int s_code_ar[5]; 我们的程序员读取一个配置文件,然后把提取出来的code存入这个
2015-11-13 16:09:21
4865
原创 C语言封装disruptor
disruptor是一个java的并发编程框架,不了解的可参考:http://www.oschina.net/p/disruptor在理解了disruptor的原理之后,然后参考一个开源的disruptor for c(https://github.com/colding/disruptorC)后写了一个disruptor库,通过该库可以更容易地使用这个框架。头文件disruptor.h:#if
2015-09-22 13:31:24
2645
原创 hanoi
#include #include static int the_other(int from, int to){ int i = 0; int pos[3] = {0,0,0}; pos[from - 'A'] = 1; pos[to - 'A'] = 1; for (i = 0; i < 3; i++) { if (p
2014-07-10 14:36:36
1020
原创 生产者消费者模型中线程怎样正常退出
生产者:不停地往队列中放数据消费者:不停地从队列中拿数据两者通过两个信号量同步当生产者不再生产数据时,消费者正好挂在一个信号量上,处于睡眠状态,这时候pthread_join也会一直挂着的。该怎样使得消费者正常退出呢?我的做法是让生产者在往队列中放一个【结束数据】,也就是一个标识,消费者拿到数据后,如果这个数据是结束标识则自杀退出。
2014-06-23 14:23:56
2591
原创 一个让人崩溃的编码错误
最近写了一个接受socket数据包,然后再重组上层协议包的东西。每次read到数据就将数据添加到一个链表的尾部,然后检查是否收到了一个完整的包。为了减少内存碎片,把用过的链表节点添加到另外一个链表中,这样下次可以从这个cache链表中重用节点。 在debug的时候我把cache list中的数据打印出来,代码如下:struct seg_node{ void* bu
2014-05-25 17:33:18
1269
原创 linux多线程环境下的抢尸行为(system返回-1:No child processes)
故事背景: 我们这边开发了一个动态库给客户用,动态库里面会调用system来做insmod/rmmod模块的事情。这些模块都是我们这边提供给客户的。拿到客户那边去测试,会随机性的出现system返回-1的问题,也就是system出错了!但是奇怪的是我们发现实际上insmod/rmmod是成功了的。把当时的errno和对应的出错信息打出来发现errno是10,对应的信息是No child p
2014-01-01 21:27:53
5429
原创 二分查找
二分查找作为一个高效的查找算法(O(lgN))到处可见其身影,这里分享一点儿我的理解与体会。 二分查找虽然高效,但局限性也很明显: 首先,需要是连续内存; 其次,序列应该是已经排序好的,不管从小到大或者从大到小。 就以上两点,很多情况下都不能用二分查找。比如,我的数据可能是动态增加的,会有很多的添加操作。如果使用连续内存的话,显然会有大量的内存移动。因此,只能用链式
2013-12-11 20:49:09
1055
原创 TCP/IP:frame的接收方式之中断方式
在学习TCP/IP时,不可避免地要理解接收frame的中断方式和轮询方式,以及两者的结合。为什么不坚持中断方式?因为在负载高时效率低,为什么低?因为中断频繁...等等。其实,如果我们理解了中断的过程,那么就很好理解了。 首先,我们来看看中断方式相对于轮询方式的优点。 由于我们不知道数据包什么时候会来,因此,为了能否在数据包来后及时的处理,所以要不停的去读状态看看数据来了没。显然,如
2013-12-07 22:16:20
2295
原创 sk_buff经过协议栈时的变化---从TCP层向下到链路层
近来开始结合linux源码看TCP/IP,看到sk_buff时被其各个数据成员弄得有些糊涂,靠死记硬背显然是不行的。最终,结合书本(Understanding LINUX Network Internals)把sk_buff中主要的几个数据成员的变化情况画了出来。这种学习方法我一直在用,效果挺好。transport layer: 首先,看看通过alloc_skb创建的sk_buff的内
2013-12-03 21:48:04
1787
原创 有没有这样的一本书
最近在看TCP/IP的书,书确实不错,讲得易懂。但是,有些东西书肯定讲不清,这时我很渴望能够看Linux内核这部分的实现,通过代码能够理解的更透彻些,毕竟,书上的思想可能已经过时了。 那么,有没有这样的一本书呢?就是讲理论的时候会标注一下这个算法理论的实现在Linux代码的哪个地方。
2013-11-04 18:49:27
1337
1
原创 IP转发时,包是怎么送到next-hop的?
首先,有一点要明白:从source到dest的过程中,IP datagram中的source IP和dest IP保持不变(只有一个例外情况)。 但是,我们知道,在IP转发时,如果dest host不在直接连接的网络上,会把datagram发到next-hop,那么next-hop的地址存在哪?我们来看看IPv4的数据格式: 显然,数据格式中没有为next-hop地址预
2013-11-03 15:50:41
1757
原创 【广度优先遍历】营救公主
题目描述:公主被魔王抓走了,王子需要拯救出美丽的公主。他进入了魔王的城堡,魔王的城堡是一座很大的迷宫。为了使问题简单化,我们假设这个迷宫是一个N*M的二维方格。迷宫里有一些墙,王子不能通过。王子只能移动到相邻(上下左右四个方向)的方格内,并且一秒只能移动一步,就是说,如果王子在(x,y)一步只能移动到(x-1,y),(x+1,y),(x,y-1),(x,y+1)其中的一个位置上。地图由‘S’,
2013-07-20 20:48:30
6765
原创 计算蜂窝中两个点之间的距离
如下图所示,求两个id之间的距离,如1到18的距离为2.方案是用极坐标法,然后确定每个ID的坐标,再根据坐标来计算距离。代码如下:#ifndef HONEYCOMB_H#define HONEYCOMB_Hextern void init_honeycomb(int max_id);extern int calc_distance(int id1, int i
2013-07-19 01:11:24
2210
原创 linux信号处理流程前篇---内核态与用户态的切换
由于linux中信号的处理时机在内核态返回用户态时,所以本文首先讲一下用户态与内核态的切换。 首先,我们来看用户态到内核态的切换。用户态切换到内核态有两种途径,第一种是中断,这个是被动的。第二种是系统调用,这个是主动的。 1、中断 对于一个正在运行的task来说,其运行在用户态时,内核栈是空的。中断到来时,会将当时的寄存器(用户态寄存器)信息按照pt_regs的结构压入到内
2013-07-03 23:13:54
2603
原创 什么叫做程序(或者说进程)在运行?
初看这标题,简直就是个渣写的,程序运行嘛,就是一个程序在运行嘛.......比如说这个暴风影音正在放片儿,这个QQ正在发送消息等等,这些都是看得见的,那么看不见的呢? 不管咋滴,我觉得还是弄得清楚些好点,弄懂了基本上不会忘记,记住的东西往往会忘记。说一个程序在运行是什么意思,这个问题其实回归到现代计算机的模型这个问题上。就是冯诺依曼模型吧。Let's have a look:
2012-10-30 20:44:16
1750
原创 C基础----返回局部变量的地址&栈(linux)
近来是校园招聘高峰期啊... ... 局部变量之局部指的是一个变量的作用范围,例如一个函数内定义的变量。这里我们要说的就是这种变量。 很多书上或者说面试宝典呐之类的,都说不要返回一个局部变量的地址以供外部使用。怎么说呢,这种说法应该是基于编码习惯软件工程角度来说的,这种做法确实很容易出问题,但不是一定会出问题。下面我们来看一个简单的C代码: 1 #include 2
2012-10-15 23:01:41
5839
原创 C基础----函数参数传递之值传递
最近逛优快云多了,看到论坛中很多新手提的问题,不禁想写个博客和大家分享一下。同时对自己也是一个复习。 我们还是直接通过代码来讲: 1 #include 2 3 int foo(int a, int b) 4 { 5 a = 1; 6 b = 2; 7 8 return a + b; 9 } 10 11 1
2012-10-14 19:10:09
1312
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人