Openssl与数字签名


安全相关的开发工作不可避免的会碰到“数字签名”,“数字证书”等概念,无论是数字签名还是数字证书都跟openssl这个超级厉害开源软件有着千丝万缕的联系。笔者在研究安全启动的过程成中被数字证书这套技术折腾得焦头烂额,本文打算从非对称加密算法说起,分析数字签名、数字证书的来龙去脉,同时会介绍一些Openssl关于证书管理等方面的命令。 Continue reading “Openssl与数字签名”

Advertisements

Dining philosophers problem


哲学家就餐问题。这是由计算机科学家Dijkstra提出的经典死锁场景。原版的故事里有五个哲学家(不过我们写的程序可以有N个哲学家),这些哲学家们只做两件事--思考和吃饭,他们思考的时候不需要任何共享资源,但是吃饭的时候就必须使用餐具,而餐桌上的餐具是有限的,原版的故事里,餐具是叉子,吃饭的时候要用两把叉子把面条从碗里捞出来。很显然把叉子换成筷子会更合理,所以:一个哲学家需要两根筷子才能吃饭。现在引入问题的关键:这些哲学家很穷,只买得起五根筷子。他们坐成一圈,两个人的中间放一根筷子。哲学家吃饭的时候必须同时得到左手边和右手边的筷子。如果他身边的任何一位正在使用筷子,那他只有等着。 Continue reading “Dining philosophers problem”

mutex实现semaphore


Mutex变量是非0即1的,可看作一种资源的可用数量,初始化时Mutex是1,表示有一个可用资源,加锁时获得该资源,将Mutex减到0,表示不再有可用资源,解锁时释放该资源,将Mutex重新加到1,表示又有了一个可用资源。信号量(Semaphore)和Mutex类似,表示可用资源的数量,和Mutex不同的是这个数量可以大于1。 Continue reading “mutex实现semaphore”

生产者-消费者模型mutex实现


对于多线程的程序,访问冲突的问题是很普遍的,解决的办法是引入互斥锁(Mutex,Mutual Exclusive Lock),获得锁的线程可以完成“读-修改-写”的操作,然后释放锁给其它线程,没有获得锁的线程只能等待而不能访问共享数据,这样“读-修改-写”三步操作组成一个原子操作,要么都执行,要么都不执行,不会执行到中间被打断,也不会在其它处理器上并行做这个操作。Mutex用pthread_mutex_t类型的变量表示,可以这样初始化和销毁: Continue reading “生产者-消费者模型mutex实现”

回调函数的三个问题


C语言里面最犀利的武器就是指针,其中一种比较特殊的指针叫做函数指针,关于函数指针有一种很广泛的应用叫做回调函数,这篇文章打算回答下面三个问题:

  • 什么是回调函数?
  • 回调函数怎么实现?
  • 回调函数的应用场景?

Continue reading “回调函数的三个问题”

Makefile基础


一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 Continue reading “Makefile基础”

C标准库中的字符串操作函数


程序按功能划分可分为数值运算、符号处理和I/O操作三类,符号处理程序占相当大的比例,符号处理程序无处不在,编译器、浏览器、Office套件等程序的主要功能都是符号处理。无论多复杂的符号处理都是由各种基本的字符串操作组成的,这里总结C语言的标准库函数做字符串初始化、取长度、拷贝、连接、比较、搜索等基本操作。 Continue reading “C标准库中的字符串操作函数”