-
2008-10-27
ubuntu 8.04建立mysql C开发环境 - [编程]
安装mysql
kissgnu@kissgnu-desktop:~$ sudo apt-get install mysql-servel mysql-client
下载安装过程中,会提示输入root密码
重新启动mysql服务器:
kissgnu@kissgnu-desktop:~$ sudo /init.d/mysql restart
给普通用户授权操作数据库:
kissgnu@kissgnu-desk... -
2008-04-10
VC++6.0内存文件映射 - [编程]
由于某种需要,很多时候可能需要对文件进行随机偏移读取和修改。一般情况下,可以先fseek到文件中制定的位置,再将文件块读入内存-修改-写回。 对于大文件(GB量级),或者频繁的随机文件读写,这样的方式会非常耗费时间。
这类操作一般是以内存映射文件(即将文件映射到进程的某一块空间)的方式来加以处理的。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,这意味着在对文件进行处理时将不必再为文件申请并... -
2008-03-19
hacker一段C代码 - [编程]
看下面一段程序: //demo.c
#include<stdio.h> void function(void) { char buf[9]; //#a int* ret; //#b ret = buf + 17; //#c (*ret) += 7; //#d } int main(int argc, char* argv[]) { int x; x = 55; ... -
2008-03-09
VC++6.0共享内存技术总结 - [编程]
VC++6.0共享内存技术总结
程序1 -- 建立共享区:
HANDLE m_hMapFile=CreateFileMapping( //创建一个有名的共享内存
(HANDLE)0xFFFFFFFF, //0xFFFFFFFF表示创建一个进程间共享的对象
NULL,
PAG... -
2007-10-09
Linux下读写速度测试 - [编程]
一. 文件一次读入速度
linux下读文件这东西最后都是要通过系统调用sys_read(fd,buf,count)来实现的,所以如果要提高速度,就是最简单地调用sys_read的封装,比如直接用read()或fread()。下面是我在linux下的几个测试。
首先创建一个130M数据文件 dd if=/dev/zero of=data bs=1024k count=130
分别用fread,read和fgets一次读入全部大小文件所消耗时间对比,... -
2007-09-16
gcc 扩展typeof - [编程]
(FROM : )
Another way to refer to the type of an expression is with typeof. The syntax of using of this keyword looks like sizeof, but the construct acts semantically like a type name defined with typedef.
There are two ways of writing the argument to typeof: with an expression or with a type. Here is an example with an expression:
typeof (x[0](1)) -
最近看了Programming from Ground Up的第九章内存管理主题。
在Linux中每一个进程都可以访问0-4G的虚拟线性内存地址,而其中0-3G(0xc0000000)为用户空间,用户进程可以访问其中任何一个地址。这个最大值(0xc0000000)在Linux中通常被定义为TASK_SIZE,这个值也就是用户空间所能访问的极限。从3G-4G的虚拟内存地址空间为内核态地址空间,其中存放的数据由所有进程共享但只能由内核访问,用户进程不能访问。用户进程可以通过中断或者系统调用使操作系统的用户态切换到内核态来访问内核态数据。
每个程序都认为自己被装载到0x0804800开始内存,并且其栈从0xbfffffff向下增长的.当装载一个程序时,先从内存在中找一段未用的内存,告诉处理器我要以虚拟地址0x0804800 来... -
2007-07-10
共享库(Shared Libary)/动态链接库 - [编程]
今天看了Programming from Ground Up的第八章Sharing Functions with Code Libraries,主要讲的是共享库.
有两种方法使用lib库
static library 连接时连接器将产生一个独立的object文件(这些object文件保存着程序所要引用的函数和数据)的copy。
shared library 用这样连接出来的程序仅在可执行程序中存储着共享库的名字和一些程序引用到的标号。在运行时,动态连接器(在ELF中也叫做程序解释器)将把共享库映象到进程的虚拟地址空间里去,通过名字解析在共享库中的标号。该处理过程也称为动态连接(dynamic linking)
一个简单的汇编使用libc链接库的例子如下:
... -
2007-07-08
汇编语言函数调用过程 - [编程]
今天看了Programming from the Ground Up的函数(Page 53)调用一章,对汇编语言函数调用有了一些了解。在汇编语言中需要调用函数时要call这个函数名,函数的执行过程如下:
准备执行
在主程序中每次调用函数时,先依次把各参数以相反的顺序入栈;
然后call func_name, 这里call要做两件事: 一是把函数的返回地址入栈,二是让指令执行指针%eip指向函数开始处。
开始执行
现在函数要开始执行了,但它还有一点小事要做,首先把原来的基地址寄存器%ebp值入栈,因为在程序执行中%ebp要另作它用,接着堆栈指针%esp的值复制给%ebp, 此后在函数 执行中%ebp一直保持... -
看似简单的一段程序如下:
int main()
{
int i,j[8];
for(i=0;i<=8;i++)
j[i]=0;
return 0;
}
gcc编译运行会陷入死循环.
因为变量 i 和数组 j[8]是保存在栈中,默认是由高地址向低地址方向存储. 输出变量地址可以发现: i 存储位置在0xbfd90dec, j[0]、j[1]...j[7]在内存的地址分别是0xbfdab0... -
2007-05-20
Linux系统相关信息 - [编程]
终端shell命令 uname -a 输出系统的相关信息
#uname -a
Linux chaos 2.6.9-42.0.2.EL.1.cernsmp #1 SMP Fri Sep 8 15:19:18 CEST 2006 x86_64
程序实现:
#include <sys/utsname.h>
#include <stdio.h>
int main()
{
struct utsname buf;
if(uname(&buf) < 0)
return -1;
... -
已知二维数组: int a[10][10],下面每一列等价
a
a[i],*(a+i),*a
a+1,&a[1]
a[1],*(a+1)
a[1]+2,*(a+1)+2,&a[1][2]
*(a[1]+2),*(*(a+1)+2),a[1][2]
1. int a[10][10]
int *p,i;
p=a[3]; //使p指向a[3]这个数组(大小为10)的首地址,sizeof(p)=10*sizeof(int)
i=*p[2]; //*p[2]表示a[3][2]
下... -
格式符即在printf()中的%x
d/i 以大符号的十进制形式输出整数(整数不输出符号)
o 以八进制无符号形式输出整数(不输出前导符)
x,X 以十六进制无符号形式输出整数(大小写)
u 用于输出unsigned类型数据
f 实数格式输出,6位小数
e 以指数形式输出实数,输出13位,其中:1位整数,1位小数点,6位小数,5位指数(含字符e和指数的符号)
g 根据数值大小,自动选择f或e格式输出。
c 以字符形式输出,只输出一个字符
s 输出字符串
另: printf("%#x\n",20);
输出... -
2007-05-02
程序的存储空间布局/堆与栈 - [编程]
栈
由编译器自动分配释放管理。局部变量及每次函数调用时返回地址、以及调用者的环境信息(例如某些机器寄存器)都存放在栈中。新被调用的函数在栈上为其自动和临时变量分配存储空间。通过以这种方式使用栈, -
2007-04-24
使用sqlite3与C接口开发数据库程序 - [编程]
最近我正在Linux平台写一个软件,需要用到一个简单的数据库。mysql做数据库固然很好,但其数据是存放在服务器的。我想要的基本功能也就是使用C程序创建一个数据库本地文件,然后可以对这个数据库文件执行基本的sql操作. 就像在Windows平台基于VC6.0的DAO数据库编程一样(创建一个本地文件.mdb).
从网上找到了一个开源免费的数据库开发工具--sqlite, 网上的关于sqlite的介绍有很多,详细见官方网站: -
2007-04-23
C函数提取文件名编号 - [编程]
现在在做一个软件,遇到这样一个小问题:从目录字符串 "/home/foxman/source_data/234.bin" 中提取出文件数字编号234。C/C++处理字符串的能力并不是很强,所以想到下面的实现代码:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main()
{
char *filename="/home/foxman/source_data/234.bin";
char *p=rindex(filename,'... -
2007-04-22
Qt中 文件对话框QFileDialog 的使用 - [编程]
资料来源于Qt官方文档,我总结了其中常用到的部分:
一. 最简单的方法是调用静态函数来对话框获取文件:
QString file = QFileDialog::getOpenFileName(
"/home/foxman",
... -
2007-03-21
结构体的字节对齐问题 - [编程]
结构体(struct)的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。先看下面定义的两个结构体.
struct
{
char a;
short b;
char c;
}S1;
struct
{
char a;
char b;
short c;
}S2;
分别用程序测试得出sizeof(S1)=6 , sizeof(S2)=4
可见,虽然两个结构体所含的元素相同,但因为其中存放的元素类型顺序不一样,所占字节也出现差异。这就是字节对齐原因。通过字节对齐,有助于加快计算机的取数速度,... -
2007-01-27
ubuntu 6.10建立Qt/KDE开发环境 - [编程]
Qt 文档网址: http://doc.trolltech.com/
Qt3 文档中文翻译版网址: http://www.qiliang.net/qt/index.html
安装Qt3
#sudo apt-get install qt3-dev-tools qt3-examples python-qt3 qt3-designer qt3-assistant
包括相关Qt类库、qma... -
这两天在看Fudan FireBird bbs 代码的telnet.c 和bbsd.c部分。觉得看代码真是学习编程的好方法,遇到一些以前没怎么注意的字符串处理函数,研究了一下。
一.几个内存拷贝函数
1.char *strcpy(char *dest,const char *src);
strcpy将参数src字符串拷贝至参数dest所指的地址,返回参数dest的字符串起始地址。如果参数dest所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,考虑用strncpy()来取代。
2.char * strncpy(char *dest,const char *src,size_t n);
strncpy()会将参数src字符串拷贝前n个字符至参数dest所指的地址,返回参数dest的字符串起始地址。返回参数dest的字符串起始地址。
3.void * memcpy (void * dest ,const void *src, size_t n);
memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strncpy()不同的是,memcpy()会完整的复制n个字节,不............. -
2006-12-08
C结构体中的函数指针与函数 - [编程]
1. 函数指针
一般的函数指针可以这么定义:
int(*func)(int,int);
表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数:
int add2(int x,int y)
{
return x+y;
}
那么在实际使用指针func时可以这样实现:
func=&add2; //指针赋值,或者func=add2; add2与&add2意义相同
printf("func(3,4)=%d\n",func(3,4));
事实上,为了代码的移植考虑,一般使用... -
对于复数数列,Zn=Z2n-1+Zc生成的点列,因复数常量Zc 和初值Z0的不同值,通过叠代的方式,会出现收敛、振动、发散情况。对于某个Zc, 数列不发散的初值Z0 的集合称为julia集合。
固定Zc后,定下复平面上某个区域,对于该区域内的每个点,将这些点作为初值看点列的动态,如果可以不发散,那么在这个区域描绘改点。这样就可以得到julia集合图形了。

-
2006-10-30
让定义的宏输出自己的内容 - [编程]
有一个问题一直困扰着我,就是怎么输出宏定义的内容,也就是
#define STR abcdefg
对于任意的一个宏定义(STR),怎样可以把它替代的内容(abcdefg)输出来?首先想到的是使用#算符,比如printf(#STR),可是只能输出STR, 没有预期结果。在AnsiC版讨论后找到一个方法:
#define STR abcdefg
#define mkstr(x) #x
#define showstr(x) mkstr(x)
int main()
{
printf("%s\n", showstr(STR));
}宏是由外往内展开,对于showstr(x):如果x不是macro ,就直接转换为 mkstr(x); 如果x是macro, 会先展开x ,变为 showstr(abcdefg), 然后再展开成为 mkstr(abcdefg) (falls言)
还有一种不是办法的办法,就是定义以宏STR命名的函...... -
2006-10-02
“UNIX 环境高级编程“第二版 的几个附录源文件 - [编程]
官方网站上的代码好像还是前一个版本没有更新,今天上午我对照书附录和原来的代码修改如下,分别是头文件apue.h, 标准出错代码sys.c,守护进程出错代码log.c, 供参考。
可以从这儿下载: http://feizf.blogbus.com/files/1160056392.rar







