
开发
牛晨光
热爱技术的IT从业者
展开
-
编写安全代码——不要用memcmp比较structure
本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。作者:gfree.wind@gmail.com博客:linuxfocus.blog.chinaunix.n转载 2011-07-20 13:46:18 · 2213 阅读 · 1 评论 -
避免僵尸进程
为了让更好理解此文中提到的方法,需要你知道僵尸进程是如何出现的。简单的了解可以阅读此文章《僵尸进程》。1、阻塞等待 让父进程主动调用waitpid进行等待是最朴素最直接的做法。当父进程由于功能要求不允许其阻塞等待时我们怎么办?最容易想到的答案是“线程”,原创 2011-08-08 12:26:04 · 2674 阅读 · 1 评论 -
fmod简单使用试例
#include #include #include "fmod.h"#define FILENAME "wave.mp3"int main(){ FMOD_RESULT fmodResult; FMOD_SYSTEM *fmodSystem;原创 2011-09-08 16:56:16 · 6397 阅读 · 0 评论 -
监视热插拔事件
#include #include #include #include #include #include #include #include #include #include static int init_hotplug_sock(void){原创 2011-09-08 17:01:13 · 1317 阅读 · 0 评论 -
使用HTML5制作物理游戏
原文:http://www.enjoyhtml5.com/2011/11/html5-game-with-box2djs/简介HTML5技术为现今Web应用程序在浏览器中提供了非常广阔的发挥空间,其强大的功能让我们在浏览器上开发游戏和玩游戏不再是难事。利用Canvas和强大的JavaScript引擎,我们可以轻松地完成休闲游戏的开发。玩家只需打开浏览器,不用安装插件便可以享转载 2011-11-30 10:14:05 · 1635 阅读 · 0 评论 -
获取tcp/udp端口对应的进程pid
可能有一些朋友想要做一些监视流量工具却不知道如何根据端口获取到进程的PID,如果你搜了一圈也没有找到满意的答案,希望我的这个文章可以帮到你。1、获取当前活动的TCP/UDP端口值。你会有许多方法获取此值,这里不多废话了。(我用的方法是通过raw socket进行抓包分析,你也可以用libpcap库实现)。假设当前我发现一个本地端口为54351的tcp端口。当前状态:tcp_po原创 2011-11-29 11:45:15 · 19051 阅读 · 11 评论 -
VT100 控制符文档
转自: http://blog.youkuaiyun.com/kerlw/article/details/130952这个东西很好玩,你可以用这些东西来展现多彩世界。格式: echo "/033[字背景颜色;字体颜色m字符串/033[0m" (如果是在C程序中调用,就使用printf函数来打印这些控制符就可以了。)例如: echo "/033[41;36m something here转载 2012-01-18 09:49:35 · 4813 阅读 · 1 评论 -
使用FD_CLOEXEC实现close-on-exec,关闭子进程无用文件描述符
我们经常会碰到需要fork子进程的情况,而且子进程很可能会继续exec新的程序。这就不得不提到子进程中无用文件描述符的问题!fork函数的使用本不是这里讨论的话题,但必须提一下的是:子进程以写时复制(COW,Copy-On-Write)方式获得父进程的数据空间、堆和栈副本,这其中也包括文件描述符。刚刚fork成功时,父子进程中相同的文件描述符指向系统文件表中的同一项(这也意味着他们共享原创 2011-12-09 10:23:42 · 21285 阅读 · 5 评论 -
从2开始的256个素数
unsigned short g_prime_table[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97,原创 2012-03-02 17:25:56 · 1923 阅读 · 0 评论 -
Boyer-Moore 精确匹配算法实现(C/C++)
算法原理这里不废话,网上找到的算法很多再临界情况的处理都有错误,所以自己重写了一个。预处理创建shift资源表时的效率比较一般,但是简单易懂! 如果你有更好的版本希望发来研究研究。/* * Boyer-Moore 精确匹配算法 * ------------------------------------------- * copyright (c) 2012 Niu Ch原创 2012-03-09 11:40:45 · 6023 阅读 · 0 评论 -
对UTF8编码方式字数做统计的函数
#define UTF8_ASCII(byte) (((unsigned char)(byte)>=0x00)&&((unsigned char)(byte)<=0x7F))#define UTF8_FIRST(byte) (((unsigned char)(byte)>=0xC0)&&((unsigned char)(byte)<=0xFD))#define UTF8_OTHER(byte)原创 2012-03-16 10:48:21 · 3213 阅读 · 1 评论 -
_gcry_ath_mutex_lock: Assertion `*lock == ((ath_mutex_t) 0)' failed.
如果你的多线程程序出现如题的错误,然后直接 Aborted (core dumped) 掉,那么一定是由于你所使用的gnutls接口没有进行锁的初始化,在程序初始化时加入以下代码即可:#include static int mutex_init(void **mutex){ *mutex = malloc(sizeof(pthread_mutex_t)); pthre原创 2012-03-19 12:44:30 · 8126 阅读 · 0 评论 -
不使用任何额外变量,实现倒序字符串
昨天和同事聊天聊到了这个问题,今天写了个实现,放上来供大家拍砖。主要思路是利用抑或操作!#include #include void swap_char(char *p, int len){ if (NULL == p || len <= 0) { return; } len--; // 保证p+len指向最后一个待交换的字符原创 2012-06-13 10:32:21 · 1968 阅读 · 1 评论 -
申请pty的实例
前段时间实现一个类似PAC的工具,为了实现相关功能需要在代码中实现申请pty。相信很多人虽然知道pty是什么东西,却从未亲手写过相关代码申请pty。我粘贴自己实现的部分代码并简单注释,希望能对有需要的同学们提供一些帮助。 #define _XOPEN_SOURCE // 记得定义此测试宏,否则grantpy等函数不可用 #include // Your原创 2012-06-12 12:11:07 · 1238 阅读 · 0 评论 -
解决 iframe 页面乱码
今天公司的做web同事遇见一个问题,大概描述如下:本公司的web页面为了支持国际化全部选择使用utf-8编码方式,由于客户需求需要iframe客户的一个页面,客户页面的编码是gbk,但是没有charset声明。这样就造成了我们iframe客户的页面时,因为我们的charset声明为utf-8且iframe里的页面没有编码声明造成iframe的内容都成了乱码。我们的编码方式是不能变的,客原创 2009-02-23 15:44:00 · 51975 阅读 · 13 评论 -
C实现快排算法
上学时学过的快排算法,不过还真没去好好看更没有把它用语言实现。现在正好想补补算法,自己写了一个实现。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。我这个用的原地排序实现的,代码很短逻辑很简单而且我还添加了大原创 2011-07-20 13:53:00 · 15508 阅读 · 5 评论 -
获得本机IP地址列表
/* * main.c * ---------------------------------------------- * 2013-01-09 chrisniu1984@gmail.com * * [BUILD] * gcc -o main main.c -Wall * */#include #include #include // 系统定义的结构,贴在这里方便大原创 2013-01-09 11:17:55 · 1686 阅读 · 4 评论 -
C++子类调用父类覆盖的函数
/* * main.cpp * C++子类调用父类覆盖的函数 */#include class base{public: base(){} ~base(){} virtual void print() {printf("i'm base!\n原创 2011-07-20 17:30:33 · 7344 阅读 · 0 评论 -
汉诺塔解法
/* * hanoi.c */#include #include int m_count = 0;void hanoi(int n, char from, char pass, char to){ if (n == 0) return;原创 2011-07-20 17:29:31 · 1611 阅读 · 0 评论 -
printf函数打印百分号
printf("%%");原创 2011-07-20 16:51:28 · 10945 阅读 · 0 评论 -
查看libc库的版本
执行 /lib/libc.so.6 就会显示相关信息。如niu@niu:~$ /lib/libc.so.6GNU C Library (Ubuntu EGLIBC 2.12.1-0ubuntu8) stable release version 2.12.1, by Roland原创 2011-07-20 17:02:04 · 22657 阅读 · 0 评论 -
Windows SDK 创建窗体
VC++ 6.0 调试通过。提供给想了解Windows窗体创建机制和讨厌MFC的兄弟们。从一个支持文件拖拽的例子抠出来的代码,代码简单易懂。有空再加注释吧。了解Windows机制的淫应该很容易明白代码在干啥。比如什么是窗体类,窗体实力,消息处理等。创建窗体程序的步骤等 #include "windows.h"int WINAPI WinMain( HINSTANCE hInstance,HINST原创 2009-03-02 11:12:00 · 1218 阅读 · 0 评论 -
LD 算法实现(编辑距离算法)
LD算法就是自然语言处理(NLP)里的“编辑距离”算法。俄国科学家Levenshtein提出的,故又叫Levenshtein Distance (LD算法)【定义】设A和B是两个字符串。将字符串A转换为字符串B所用的最少字符操作数称为字符串A到字符串B的编辑距离。( 这里所说的字符操作包括:删除一个字符,插入一个字符,修改一个字符)如果有人想看具体算法的描述还是自己去搜吧。我搜到的算法描述大部分是原创 2009-02-19 18:54:00 · 7123 阅读 · 2 评论 -
使用libssh2库实现支持密码参数的ssh2客户端
/* * 可以使用密码参数的 SSH 客户端程序 v1.0 * Copyright (c) 2011 Niu.Chenguang * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *原创 2011-07-20 13:49:46 · 10002 阅读 · 8 评论 -
linux下使用QT编译Webkit
(比较早看到的教程,忘记参考哪位大神的教程了,请见谅!)1、从官方 http://webkit.org/ 获得WebKit的完整源码。我WebKit源码存储的目录为 /home/niu/opensource/webkit/2、安装 libqt4-dev gperf bison f转载 2011-07-20 13:56:58 · 4137 阅读 · 1 评论 -
c使用静态变量降低耦合度
1、与普通的函数内部局部变量相比,它有更长的生命周期(与程序有相同的生命周期)。2、与全局变量比,它有很好的访问范围限制。当你很好的理解以上2点后就可以很好的使用静态变量了,以下是2个使用经典场景:1、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块原创 2011-07-20 15:45:20 · 2299 阅读 · 0 评论 -
虚拟机刷固件须注意
我为了描述方便,这里定义几个名词。本机系统:host虚拟机系统:guest电子设备:device刷设备的软件:software如果是使用host刷固件,整个过程一般是比较简单的,但是使用guest刷device固件时难免碰到各种问题,其中最常见的问题是刷到一半突然刷固件的软件找不原创 2011-07-20 16:49:28 · 2290 阅读 · 0 评论 -
不靠谱的Access 轻松破解密码
刚刚无意间发现网上有很Access密码破解工具,而且不是穷举方法的暴力破解。据说是Access中的某个偏移位置开始就是存储的密码信息。所以我把2个设置不同密码的空数据库进行二进制比较(一个密码是abc,另外一个是123)。果然只有3个字节的内容不同(当然不是明文存储的密码)。试着去找规律,一般最简单的加密方法就是把当前密码和一个固定字节数组做异或运算(异或运算不用说了吧,一次异或加密,再异或解密,原创 2009-02-24 16:25:00 · 4325 阅读 · 1 评论 -
C#调用C++ DLL令人头痛的两件事
很久前保留的内容,忘记原作者是谁了。1. 数据类型转换问题因为C#是.NET语言,利用的是.NET的基本数据类型,所以实际上是将C++的数据类型与.NET的基本数据类型进行对应。 [如]DLL中函数声明为int __stdcall FunctionName(unsigned char param1, unsigned short param2)参数数据类型在C#中,必须转为对应的数据类型。[Dl转载 2009-02-18 23:37:00 · 5414 阅读 · 1 评论 -
BDB中索引算法的选择:Hash vs BTree
Hash 和 Btree方法应该被用于当逻辑记录号不是用来做主键对数据访问的情况。(如果逻辑记录号是一个secondary key,用来对数据进行访问,Btree方法是一个可能的选择,因为它支持通过一个键和一个记录号来同时的访问。)Btrees中的键是按一定的秩序来存放的。Btr转载 2011-07-20 13:47:35 · 3369 阅读 · 0 评论 -
64-bit Ubuntu 编译/运行 32-bit 程序
运行32-bit程序比较简单,只需要安装以下2个开发包即可 ia32-libs 和 libc6-i386.ia32-libs 是 ia32/i386 框架的运行时库。libc6-i386 是一套可运行在64-b it 系统中的 32-bit 共享库。sudo aptitude i原创 2011-07-20 16:39:51 · 4457 阅读 · 0 评论 -
定义结构体时变量名后的冒号和数字
如下: struct frame_control { u_char fc_subtype : 4; u_char fc_type : 2; u_char fc_protocol_version : 2; u_char fc_order :原创 2011-07-20 17:00:09 · 16583 阅读 · 1 评论 -
gcc 内置宏配合调试
/* * test.c */#include int main(int argc, char **argv){ printf("[%s:%d]%s\n", __FILE__, __LINE__,__FUNCTION__); printf("[%s:%d原创 2011-07-20 17:14:34 · 1712 阅读 · 0 评论 -
gcc -fPIC选项
使用 -fPIC 选项,会生成 PIC 代码。.so 要求为 PIC,以达到动态链接的目的,否则,无法实现动态链接。non-PIC 与 PIC 代码的区别主要在于 access global data, jump label 的不同。比如一条 access global data转载 2011-07-20 17:15:52 · 13592 阅读 · 0 评论 -
死锁
一般情况下,如果同一个线程先后两次调用lock,在第二次调用时,由于锁已经被占用,该线程会挂起等待别的线程释放锁,然而锁正是被自己占用着的,该线程又被挂起而没有机会释放锁,因此就永远处于挂起等待状态了,这叫做死锁(Deadlock)。另一种典型的死锁情形是这样:线程A获得了锁1,原创 2011-07-20 17:26:58 · 918 阅读 · 1 评论 -
获得逻辑cpu个数
#include #include int main(){ printf("_SC_NPROCESSORS_ONLN = %ld\n", sysconf(_SC_NPROCESSORS_ONLN)); return 0;}原创 2011-07-20 17:29:53 · 1204 阅读 · 0 评论 -
Linux下设置ICH7-M的磁盘控制器为AHCI模式
【声明】使用本文提供的方法设置ACHI而对硬件造成的损失,本人不承担任何责任!!(理论上是没什么问题的,还是声明下的好 :-|)================================================================================================================================原创 2013-04-03 12:18:16 · 5095 阅读 · 3 评论