一个程序的开发离不开许多库函数的支持,可是库如此之多,有开源免费的也有收费的。很希望熟悉编程的前辈把自己的经验整理下,常用的库都包含哪些功能。下文是在网上找的一个类似的资料。期待更多更全的内容。
---------------------------------------------------------------------------------------------------
看到有时候大家在写代码的时候不知道应该加入何种库,所以特地总结了一下.供大家参考.
库 头文件 描述
libGL.so <GL/gl.h> 实现到OpenGL API的接口
libGLU.so <GL/glu.h> 实现到OpenGL API的接口
libImlib.so ......
//
同步问题:
对共享数据的访问,需要同步,互斥。
在中断,抢占,多CPU,多线程 环境下尤其重要。
同步分为: 阻塞同步,非阻塞同步
阻塞同步有许多实现方式了:mutex, semaphore. 阻塞同步使用不当就可能造成死锁,活锁,优先级反转。
非阻塞同步:(现在流行三种)
wait free 很难实现,思想是本线程有限步就完成,完全不用理其余线程。
lock free 确保多个线程中,总有一个线程是运行着的。在全局上看就是这个模块一直运行中。
obstruction free 线程持续运行,当发现共享数据被改,回滚。
不难得出 Obstruction-free 是 Non-blocking synchronization 中性能最差的,而 Wait-free 性能是最好的,但实现难度也是最大的,因此 Lock-free 算法开始被重视,并广泛运用于当今正在运行的程序中,比如 linux 内核。
linux内核中就主要是实现了lock free
一般采用原子级的 read-modify-write 原语来实现 Lock-Free 算法,根据此理论,业界在原子操作的基础上提出了著名的 CAS(Compare - And - Swap)操作来实现 Lock-Free 算法,Intel 实现了一条类似该操作的指令:cmpxchg8。
//原语
CAS 原语负责将某处内存地址的值(1 个字节)与一个期望值进行比较,如 ......
转载时请注明出处和作者联系方式
文章出处:http://www.limodev.cn/blog
作者联系方式:李先静 <xianjimli at hotmail dot com>
随着XP的流行,人们越来越注重软件的前期设计、后期的实现,以及贯穿于其中的测试工作,经过这个过程出来的自然是高质量的软件。甚至有人声称XP会淘汰调试器!这当然是有一定道理的,然而就目前的现实来看,这还是一种理想。在日常工作中,调试工具还是必不可少的。在Linux下,调试工具并非只有gdb,还有很多其它调试工具,它们都各有所长,侧重方面也有所不同。本文介绍几种笔者常用的调试工具:
1. mtrace
在linux下开发应用程序,用C/C++语言的居多。内存泄露和内存越界等内存错误,无疑是其中最头疼的问题之一。glibc为解决内存错误提供了两种方案:
一种是hook内存管理函数。hook内存管理函数后,你可以通过记下内存分配的历史记录,在程序终止时查看是否有内存泄露,这样就可以找出内存泄露的地方了。你也可以通过在所分配内存的首尾写入特殊的标志,在释放内存时检查该标志是否被破坏了,这样就可以达到检查内存越界问题的目的。
另外一种方法更简单,glibc已经为第一种方案提供了默认的实现,你要做的只是在特定的位置调用mt ......
Linux内核配置办法:
1. make config
这种办法会遍历所有配置项,要求用户逐个选择Y/N/M
2. make menuconfig
这个办法是基于ncurse库编制的图形界面工具。常用
3. make xconfig
用于基于X11的图形工具
4. make gconfig
用于基于gtk+图形工具
5. make defconfig
创建一个默认的配置,生成当前的.config
6. make xxx_defconfig
arch/arm/configs文件夹中有许多命名为xxx_defconfig的配置文件,如果运行make xxx_defconfig,当前.config文件会由xxx_defconfig文件生成
7. make oldconfig
(个人还不是很了解)
作用是备份当前.config文件为.config.old,如若make config/menuconfig设置不当可用于恢复先前的.config
......
Linux 消息重定向办法
command > filename
把标准输出重定向到一个指定文件中
command 1 > fielname
把标准输出重定向到一个指定文件中(同上)
command 2 > filename
把标准错误重定向到一个文件中
command >! filename
把标准输出重定向到一个
指定
文件中,若文件存在,则覆盖
command >& filename
将命令执行时屏幕上所产生的任何信息写入指定的文件中
command > filename 2>&1
把标准输出和标准错误一起重定向到一个文件中
command >> filename
把标准输出重定向到一个文件中(追加)
command 1 >> filename
把标准输出重定向到一个文件中(追加)
command >>& filename
将命令执行时屏幕上所产生的任何信息附加到指定的文件中
(追加)
command >> filename 2>&1
把标准输出和标准错误一起重定向到一个文件中(追加)
command filename2
把command命令以filename文件作为标准输入,以filename2文件作为标准输出
command &m
把标准输出重定向到文件描述符m中
......
/*
* 该文件主要实现的是truncate函数,该函数是释放指定i
* 节点在设备上占用的所有逻辑块,包括直接块、一次间
* 接块和二次间接块
*/
/*
* linux/fs/truncate.c
*
* (C) 1991 Linus Torvalds
*/
#include <linux/sched.h>
#include <sys/stat.h>
/* 释放一次间接块,参数int dev, int block指明一次间接块的设备号 */
static void free_ind(int dev,int block)
{
struct buffer_head * bh;
unsigned short * p;
int i;
// 如果逻辑块号为0,则返回
if (!block)
return;
// 读取一次间接块,并释放其上表明使用的所有逻辑
// 块,然后释放该一次间接块的缓冲区
if (bh=bread(dev,block)) {
p = (unsigned short *) bh->b_data;
for (i=0;i<512;i++,p++)
if (*p)
free_block(dev,*p);
brelse(bh);
}
free_block(dev,block);
}
/* 释放二次间接块,int dev, int block指明二次间接块的逻辑号 */
static void free_dind(int dev,int block)
{
struct buffer_head * bh;
unsigned short * p;
int i;
if (!bl ......