GNU/Linix C/C++
文章平均质量分 73
leeshuheng
UNIX, GNU/Linux C/Cplusplus R programmer 数据挖掘 机器学习
展开
-
Linux futex
下面的代码是我学习Linux futex时写的实验代码,存在大量谬误和不规范的地方,有许多认识上的错误。这只是实验代码,实际工作中不会如此编程。futex_t::wake 实际是一个计数器,防止在调用futex_wait函数前调用futex_wake而出现的死等现象,函数futex只在满足(*addr1 == val)时等待。futex_wait函数与futex_wake函数配合使用,前者等待后者唤醒。futex_lock函数与futex_unlock函数配合使用,前者加锁后者解锁。原创 2010-08-04 08:54:00 · 4751 阅读 · 0 评论 -
数字转换成指定进制的数字字符串
下面的函数将一个long型的整数转换为某个指定进制的数字字符串。正数和0的前面输出'+'号,负数的前面输出'-'号。如果指定8进制字符串则以'0'开头;如果指定16进制,则以'0x'或'0X'开头。可以指定类似16进制的数输出字母的大小写。编译: g++ -g -W -Wall -Wextra -o mytest main.cpp执行: ./myte原创 2011-11-14 11:12:51 · 1688 阅读 · 0 评论 -
信号究竟发给谁
信号究竟发给谁Linux中进程和线程本是一个东西,在内核中都是由task_struct结构标示。两者都是由do_fork内核函数来启动,只是调用do_fork的参数不同。如果进程只有一个线程,那么发给该进程的信号显然只能发给这个线程;信号和信号处理函数是进程资源,那么当进程有多个线程时,信号究竟发给谁呢?我做了3个实验来探讨这个问题,实验所采用的平台如下:OS: f原创 2011-11-29 09:19:31 · 2202 阅读 · 0 评论 -
Linux字符终端彩色进度条
我在Linux字符终端上实现了两种有趣的彩色进度条。一种是采取渐进打印的动画效果,另一种是循环打印。用C语言和shell脚本实现了这两种方式,我不怎么擅长shell脚本,所以代码写得比较凌乱。两个程序没事儿的时候可以拿来解闷。具体的实现方式可以看后面的代码。测试环境:OS: fedora 11gcc: Red Hat 4.4.0-4shell: b原创 2011-11-16 10:01:33 · 3294 阅读 · 0 评论 -
计算 ip udp tcp 效验和
下面叙述的是IPv4的 ip udp tcp 效验和的计算。ip效验和计算相对简单,只需对ip协议头进行计算;ip协议头长20字节;udp协议头长8字节;tcp协议头长20~60字节;udp和tcp的校验和不仅要对整个ip协议负载(包括udp/tcp协议头和udp/tcp协议负载)进行计算,还要先对一个伪协议头进行计算。在计算效验和前,协议头效验和字段要清0。原创 2011-10-20 16:59:15 · 1356 阅读 · 0 评论 -
自旋锁
下面的代码实现了一个简陋的自旋锁。由于仅仅是用于实验的原型代码,所以可能包含许多错误和不适当的地方。如果在信号处理函数中使用该锁,可能会死锁。该代码用于Linux环境,在fedora11中测试过。spin_lock.h:============原创 2011-09-22 14:27:10 · 1418 阅读 · 0 评论 -
makefile
这是我编译一些C原型程序时用的makefile,这些程序一般用于学习和验证一些想法makefile:======================================================================PROG=mytestCC=gccCFLAGS=-g -W -Wall -Wextra -std=gnu99sources:=原创 2011-06-15 08:56:00 · 1020 阅读 · 0 评论 -
GNU/Linux 编程中的定时器
GNU/Linux 编程中的定时器在Linux C/C++编程中GNU C库提供了多种定时器实现。主要有4种:1、alarm方式: sigaction/signal, 和alarm等函数实现;2、setitimer方式: sigaction/signal, setitimer/setitimer等函数实现;3、timer_create方式:原创 2011-06-08 12:39:00 · 6399 阅读 · 0 评论 -
pcap(Packet capture library)的简单应用
<br />pcap目前是一个应用广泛的针对网络接口数据包抓取的共享库。<br />该系统对数据抓取提供一个高层的接口,获得指定网络的全部<br />数据包,包括那些目的地址不是本机的数据包。<br /><br />下面的程序是一个简单的实验用例。它只是使用了pcap的一小<br />部分主要功能,实现对默认网络接口数据包的抓取,并实现了<br />简陋的不完全的分析。它可以被视为一个残疾版或毛坯版的<br />tcpdump。<br /><br />由于我认识上的不足和我在原创 2011-03-16 09:01:00 · 4738 阅读 · 0 评论 -
数学家和程序员
<br />前日在CSDN上看到早些时候对STL之父的一篇专访,<br />http://dev.csdn.net/htmls/11/11440.html<br />由此想到了数学家和程序员思考问题出发点的差异。<br />虽然亚历山大说自己是程序员,但我从他的言语之<br />间还是看到了他数学家的背景,他和大多数程序员<br />思考问题的方式有所不同。<br /><br />多数程序员思考问题,解决编程中的实际问题都是以数据<br />为中心,以数据为思考的出发点。因为大多原创 2010-11-17 09:30:00 · 1905 阅读 · 0 评论 -
内存泄漏检测
<br />我在Linux编程中通常使用三种方法检测内存泄漏。<br /><br />第一种方法是阅读程序源代码,打印和查看日志,观察分析程序的执行。<br /><br />第二种方法使用valgrind:<br /> 假设名为mytest的程序可能有内存泄漏的情况。<br /> 那么执行命令:<br /> valgrind -v --tool=memcheck --leak-check=full ./mytest<br /> valgrind会打印出原创 2010-12-14 09:28:00 · 923 阅读 · 0 评论 -
Linux glob 路径模式匹配
<br />glob库函数用于Linux文件系统中路径名称的模式匹配,<br />即查找文件系统中指定模式的路径。<br />注意,这不是正则表达式匹配,虽然有些相似,但还是<br />有点差别。<br /><br />编译:<br />gcc -std=c99 -g -W -Wall -Wextra -o mytest main.c<br />执行示例:<br />./mytest "./*.cpp" "./*.h" "./make*" "~/p*/p?ng"<br /><br原创 2010-12-09 09:11:00 · 11103 阅读 · 2 评论 -
快速排序(Quick sort)
在《编程珠玑》中看到作者的的quick sort的速度介于C的qsort和C++的sort之间。经过3次调优之后始终比C++的sort慢。我在作者的基础上又进行了若干次调优后,速度和C++的sort基本持平。原创 2010-10-11 14:10:00 · 931 阅读 · 0 评论 -
Linux inotify
inotify 是Linux的file system事件通知系统。用于监测指定目录内文件的创建,删除,修改,访问等操作。下面的代码是我学习过程中的实验代码,存在错误和不适当的地方。参考:inotify(7), Linux内核文档 Documentation/filesystems/inotify.txt编译:gcc -g -Wall -Wextra -std=c99 -o mytest main.c执行./mytest [指定一个目录]停止:Ctrl-C假定要监测原创 2010-08-16 08:41:00 · 891 阅读 · 0 评论 -
gcc常用扩展
部分常用的gcc扩展。__pure函数是指除了作一些运算以外(例如:strlen(...))没有其他作用,函数的返回值只影响调用函数的auto变量和按值传递的参数。__const函数是更严格的__pure函数,它的返回值只影向调用函数的按值传递的参数。__noreturn函数是指该函数一定会调用类似于exit(int)的函数终止进程。必须谨慎使用该扩展。__deprecated函数是指该函数已经废弃或应谨慎使用。在调用__deprecate前缀的函数时,编译器会给出警告。__must_c原创 2010-08-10 08:47:00 · 3444 阅读 · 0 评论 -
Linux 计算线程CPU占用率
上次的代码是计算进程的CPU占用率,这一版是计算线程的。我的CPU频率是2.92G, 所以有 #define CPU_FREQUENCY 2930000000UL。for循环没有实际意义,只是给CPU点事做。usleep的调用只是避免CPU占用率达到100%。不同的usleep时间可使线程有不同的CPU占用率。这只是实验代码,里面有许多不规范, 不适当和错误的地方,实际工作中不会如此编程。编译:g++ -g -W -Wall -Wextra -o mytest main.cpp原创 2010-08-06 12:31:00 · 3800 阅读 · 0 评论 -
Linux 计算进程CPU占用率
下面的代码是为了计算从get_cpu_proc(&cpc[0])到get_cpu_proc(&cpc[1])之间运算的平均CPU占用率的近似值。for循环没有实际作用,只是让CPU跑起来。usleep(80000)的调用是为了不让CPU占用率达到100%。我的CPU频率是2.93G,所以才有:#define CPU_FREQUENCY 2930000000UL。编译:g++ -g -W -Wall -Wextra -o mytest main.cpp执行:./mytest原创 2010-08-05 08:38:00 · 1515 阅读 · 0 评论 -
崩溃时打印堆栈调用日志
在GNU/Linux编程中,我们可能会遇到程序因为内存访问错误而崩溃或类似的问题。一般情况下,我们借助程序崩溃后生成的core文件来定位引起程序崩溃的位置。但有时我们无法在现场调试,只能依靠用户传回的一些日志文件的内容来定位程序错误的位置。如果这时日志中包含程序崩溃时的栈调用信息,那么对排除错误将会有些帮助。使用backtrace函数和addr2line程序可以帮助我们原创 2012-02-08 08:45:31 · 4229 阅读 · 0 评论