随笔分类 - Linux编程
摘要:转载自:http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml一、 概论每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制.链接脚本主要用于规定如何把输入文件内的section...
阅读全文
摘要:在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验新建一个Makefile,内容为:ifdef DEFINE_VRE VRE = “Hello World!”elseendififeq ($(OPT),define) V...
阅读全文
摘要:hexdump无参:相当于 hexdump -x 0000000 457f 464c 0102 0001 0000 0000 0000 0000 0000010 0002 003e 0001 0000 0410 0040 0000 0000-b 每一字节以八进制显示,一行共16个字节,一行开始以十六进制显示偏移值; 0000000 177 105 114 106 002 001 001 000 000 000 000 000 000 000 000 000-c 每一字节以ASCII字符显示,其余同上; 0000000 177 E L F 002 001 001 \0 \0 \0 \0 \...
阅读全文
摘要:GPL(GNU General Public License) 我们很熟悉的Linux就是采用了GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商业软件公司开发的免费软件了。 GPL协议的主要内容是只要在一个软件中使用("使用"指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品
阅读全文
摘要:在使用gdb调试程序的时候,有时候需要设定多个断点,重复执行某些操作,而这些操作写起来比较麻烦,这个时候就应该想起来用gdb命令脚本了,它能够很好的完成这些工作。以设置多个断点为例,我写的命令脚本为---------------------------------------------------#filename: .gdbinit#gdb will read it when startingfile test_gdbscriptset args hellob mainb foor---------------------------------------------------有两种方
阅读全文
摘要:以堆栈溢出为代表的缓冲区溢出已成为最为普遍的安全漏洞。由此引发的安全问题比比皆是。早在 1988 年,美国康奈尔大学的计算机科学系研究生莫里斯 (Morris) 利用 UNIX fingered 程序的溢出漏洞,写了一段恶意程序并传播到其他机器上,结果造成 6000 台 Internet 上的服务器瘫痪,占当时总数的 10%。各种操作系统上出现的溢出漏洞也数不胜数。为了尽可能避免缓冲区溢出漏洞被攻击者利用,现今的编译器设计者已经开始在编译器层面上对堆栈进行保护。现在已经有了好几种编译器堆栈保护的实现,其中最著名的是 StackGuard 和 Stack-smashing Protectio..
阅读全文
摘要:使用gdbserver远程调试 1.默认crosstool交叉编译器没有自带gdbserver,需要自行编译 到GNU官方FTP下载,目前最新版的是gdb-6.7.1下载地址:http://ftp.gnu.org/gnu/gdb/ 注:若已有gdbserver,可以直接跳到步骤4 2.编译gdbserver编译GDB源码时只需要编译出gdbserver就可以了,交叉编译器自带arm-linux-gdb(client端)可以使用。gdb-6.7.1# cd gdb-6.7.1/gdb/gdbserver/#./configure --host=arm-linux --prefix=/work..
阅读全文
摘要:1 time()提供了秒级的精确度 2 3 1、头文件 <time.h> 4 2、函数原型 5 time_t time(time_t * timer) 6 函数返回从TC1970-1-1 0:0:0开始到现在的秒数 7 8 用time()函数结合其他函数(如:localtime、gmtime、asctime、ctime)可以获得当前系统时间或是标准时间。 9 10 #include <time.h> 11 #include <stdio.h> 12 int main(void) 13 { 14 time_t t; 15 t...
阅读全文
摘要:sleep() may be implemented using SIGALRM; mixing calls to alarm(2) and sleep() is a bad idea.sleep和usleep不能使用的原因不是什么线程不安全.而是在某些平台上这两个函数可能会使用SIGALRM,导致程序其他位置的定时机制失效。实际程序中根本就不应该出现sleep和usleep,如果非要休眠不可,应考虑nanosleep或者select
阅读全文
摘要:GCC 提供的原子操作gcc从4.1.2以后的版本提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。其声明如下:type__sync_fetch_and_add(type*ptr,typevalue,...)type__sync_fetch_and_sub(type*ptr,typevalue,...)type__sync_fetch_and_or(type*ptr,typevalue,...)type__sync_fetch_and_and(type*ptr,typevalue,...)type__sync_fetch_and_xor(type*ptr,ty
阅读全文
摘要:在Linux下写C/C++程序的程序员,时常与Core Dump相见。在内存越界访问,收到不能处理的信号,除零等错误出现时,我们精心或不精心写就的程序就直接一命呜呼了,Core Dump是Linux仁慈地留下的程序的尸体,帮助程序员们解决了一个又一个问题。有时配置不给力,Linux直接毁尸灭迹,没有了Core文件;又有时,刚好磁盘空间不足,Core文件写不下了。没有Core文件的时候,如何知道程序在什么地方出错了呢?addr2line就在这时派上用场。这是一个示例程序,func函数返回参数a除以参数b的结果。这里使用0作为除数,结果就是程序因为除以0导致错误,直接中断了。 [cpp] view
阅读全文
摘要:在程序中使用#error可以在编译的时候强制产生一个错误及提示例如:#ifndef SIGSEGV#error "SIGNAL.H does not define SIGSEGV; running this program WILL cause a core dump/crash!"#endif例如:int main(){ #error "this is just used to test!" return 0;}[root@lihao /]# makecc test.c test.c:6:2: #error "this is just use
阅读全文
摘要:打算优化系统的内存分配,接管glibc提供的内存管理,但是整个工程的代码量很大,使用malloc、realloc、calloc和free的地方到处都是,如果自己写好的接口需要重命名所有的调用,先不说工作量,部分没有权限查看代码的.a文件就搞不定了。所以需要替换掉系统的malloc,保证原有调用的名称不变。经过尝试,共有四种方法可以替换,各有优缺点吧。方案1 使用环境变量LD_PRELOAD 环境变量LD_PRELOAD指定程序运行时优先加载的动态连接库,这个动态链接库中的符号优先级是最高的。标准C的各种函数都是存放在libc.so.6的文件中,在程序运行时自动链接。使用LD_PRELOAD后,
阅读全文
摘要:http://www.cnblogs.com/talking/archive/2011/04/18/2020274.html
阅读全文
摘要:在Linux系统中,可以用/proc/stat文件来计算cpu的利用率。这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。cat /proc/statcpu 65376847 3627562405159 10834971593 3765180 93399 2395097 0cpu0 7680302 5263 111909 1355640955 47680 0 185343 0cpu1 6527638 2261 327795 1356540189 249151 1 24242 0cpu2 6239465 47114 200809 1354709532 215.
阅读全文
摘要:在写代码的时候,经常会用到读取系统时间的函数。很多人都会调用localtime函数来将时间转换本地时间,但是大家往往会忽略了一点,localtime函数不是线程安全的。如果在多线程里调用localtime函数,很可能会出现问题。struct tm *localtime(const time_t *clock);这个函数在返回的时候,返回的是一个指针,实际的内存是localtime内部通过static申请的静态内存,所以通过localtime调用后的返回值不及时使用的话,很有可能被其他线程localtime调用所覆盖掉 多线程应用里面,应该用localtime_r函数替代localtime函数,
阅读全文
摘要:[ KILL ]功能描述:用于向任何进程组或进程发送信号。1#include<sys/types.h>23#include<signal.h>45intkill(pid_tpid,intsig);67参数:pid:可能选择有以下四种1. pid大于零时,pid是信号欲送往的进程的标识。2. pid等于零时,信号将送往所有与调用kill()的那个进程属同一个使用组的进程。3. pid等于-1时,信号将送往所有调用进程有权给其发送信号的进程,除了进程1(init)。4. pid小于-1时,信号将送往以-pid为组标识的进程。sig:准备发送的信号代码,假如其值为零则没有任何
阅读全文
摘要:1. 进程组每个进程除了有一个进程ID之外,还有一个进程组。进程组是一个或多个进程的集合。它们与同一作业相关联,可以接受来自同一终端的各种信号。每个进程组都有唯一的进程组ID。函数getpgrp可以得到进程的进程组ID。pid_t getpgrp(void);每个进程组都可以有一个组长进程。组长进程的标识是,其进程组ID等于进程ID。组长进程可以创建一个进程组,创建该组中的进程,然后终止。只要在某个进程组中有一个进程存在,则该进程组就存在,与其组成进程是否终止无关。进程组的最后一个进程可以终止,或者转移到另一个进程组。进程可以调用setpgid来加入一个现有的组或者一个新进程组。int set
阅读全文
摘要:这又是一个有趣的概念,daemon在英语中是"精灵"的意思,就像我们经常在迪斯尼动画里见到的那些,有些会飞,有些不会,经常围着动画片的主人公转来转去,啰里啰唆地提一些忠告,时不时倒霉地撞在柱子上,有时候还会想出一些小小的花招,把主人公从敌人手中救出来,正因如此,daemon有时也被译作"守护神"。所以,daemon进程在国内也有两种译法,有些人译作"精灵进程",有些人译作"守护进程",这两种称呼的出现频率都很高。与真正的daemon相似,daemon进程也习惯于把自己隐藏在人们的视线之外,默默为系统做出贡献,有时人
阅读全文
摘要:每一个进程都有自己的一组资源限制,在Linux系统中我们可以通过这2个API来取得和设置资源。#include int getrlimit(int resource, struct rlimit *rlim);int setrlimit(int resource, const struct rlimit *rlim);getrlimit用来取得,setrlimit用来设置。这二个参数都需要一个要控制的资源,比如控制CPU、内存、文件描述符个数等等的控制,作为第一个参数传入,第二个参数是一个rlimit的结构体地址(指针),他的结构定义放在头文件/usr/include/bits/resourc
阅读全文