07 2011 档案

摘要:我们经常会听到这样的说法,不懂得函数指针就不是真正的C语言高手。我们不管这句话对与否,但是它都从侧面反应出了函数指针的重要性,所以我们还是有必要掌握对函数指针的使用。先来看看函数指针的定义吧。 函数是由执行语句组成的指令序列或者代码,这些代码的有序集合根据其大小被分配到一定的内存空间中,这一片内存空间的起始地址就成为函数的地址,不同的函数有不同的函数地址,编译器通过函数名来索引函数的入口地址,为了方便操作类型属性相同的函数,c/c++引入了函数指针,函数指针就是指向代码入口地址的指针,是指向函数的指针变量。 因而“函数指针”本身首先应该是指针变量,只不过该指针变量指向函数。这正如用指针变量可指 阅读全文
posted @ 2011-07-28 09:21 hnrainll 阅读(670) 评论(0) 推荐(0)
摘要:realloc()函数原型:extern void *realloc(void *mem_address, unsigned int newsize);语法:指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。 头文件:#include <stdlib.h> 有些编译器需要#include <alloc.h>,在TC2.0中可以使用alloc.h头文件 功能:先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。 阅读全文
posted @ 2011-07-28 08:14 hnrainll 阅读(727) 评论(0) 推荐(0)
摘要:最近在写source code时需要在数组的buffer小时重新申请一块buffer,故找了一些资料,乖乖,竟然原指针还可以“漂移”。。。。。。realloc 原型:extern void *realloc(void *mem_address, unsigned int newsize); 用法:#include <stdlib.h> 有些编译器需要#include <alloc.h> 功能:改变mem_address所指内存区域的大小为newsize长度。 说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。 当内存不再使用时,应使用free() 阅读全文
posted @ 2011-07-27 21:23 hnrainll 阅读(6344) 评论(1) 推荐(1)
摘要:int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置0。这里只描述同步Socket的send函数的执行流程。当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲的 长度,如果len大于s的 阅读全文
posted @ 2011-07-27 21:03 hnrainll 阅读(823) 评论(0) 推荐(0)
摘要:图片可以在下面的博客中看到.转自:http://blog.csdn.net/bigloomy/article/details/6633008可能有不少读者会问,字节对齐有必要拿出来单独写一篇博客嘛?我觉得是很有必要,但是它却是被很多人所忽视的一个重点。那么我们使用字节对齐的作用和原因是什么呢?由于硬件平台之间对存储空间的处理上是有很大不同的,一些平台对某些特定类型的数据只能从某些特定地址开始存取,如通常有些架构的CPU要求在编程时必须保证字节对齐,否则访问一个没有进行字节对齐的变量的时候会发生错误。而有些平台可能没有这种情况,但是通常的情况是如果我们编程的时候不按照适合其平台要求对数据存放进行 阅读全文
posted @ 2011-07-27 18:57 hnrainll 阅读(377) 评论(0) 推荐(0)
摘要://如何将一个ASCII码的数据,分解为其两位16进制字符型数据,保存在一个字符数组中#include <stdio.h>#include <string.h>#include <unistd.h>int http_encode(char c,char *out){ int j = 0; char hex_table[16] = "0123456789abcdef"; out[j] = hex_table[c >> 4]; j++; out[j] = hex_table[c & 0x0f]; j++; out[j] = 阅读全文
posted @ 2011-07-27 17:57 hnrainll 阅读(288) 评论(0) 推荐(0)
摘要:一旦我们建立了连接,我们的下一步就是进行通信了.在Linux下面把我们前面建立的通道 看成是文件描述符,这样服务器端和客户端进行通信时候,只要往文件描述符里面读写东西了. 就象我们往文件读写一样. 4.1 写函数write ssize_t write(int fd,const void *buf,size_t nbytes) write函数将buf中的nbytes字节内容写入文件描述符fd.成功时返回写的字节数.失败时返回-1. 并设置errno变量. 在网络程序中,当我们向套接字文件描述符写时有俩种可能. 1)write的返回值大于0,表示写了部分或者是全部的数据. 2)返回的值小于0,此时 阅读全文
posted @ 2011-07-27 09:29 hnrainll 阅读(584) 评论(0) 推荐(0)
摘要:在linux的socket编程中,经常要处理EINTR错误,其值为4,用strerror(errno)调用返回的错误描述为:Interrupted system call. 这里给出一个connect连接中对EINTR处理的网址: http://www.madore.org/~david/computers/connect-intr.html 另外转载网络上其他兄弟对EINTR错误的处理: 1. accetp()是慢系统调用,在信号产生时会中断其调用并将errno变量设置为EINTR,此时应重新调用accept()。所以使用时应这样:(网址:http://bbs.loveunix.net/vi 阅读全文
posted @ 2011-07-27 09:20 hnrainll 阅读(8753) 评论(0) 推荐(2)
摘要:当linux中的C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,在实际编程中用这一招解决了不少原本看来莫名其妙的问题。但是errno是一个数字,代表的具体含义还要到errno.h中去阅读宏定义,而每次查阅是一件很繁琐的事情。有下面几种方法可以方便的得到错误信息 (1)void perror(const char *s)函数说明perror ( )用来将上一个函数发生错误的原因输出到标准错误(stderr),参数s 所指的字符串会先打印出,后面再加上错误原因 字符串。此错误原因依照全局变量 阅读全文
posted @ 2011-07-27 09:14 hnrainll 阅读(7214) 评论(0) 推荐(0)
摘要:Linux是一个可靠性非常高的操作系统,但是所有用过Linux的朋友都会感觉到,Linux和Windows这样的"傻瓜"操作系统(这里丝毫没有贬低Windows的意思,相反这应该是Windows的优点)相比,后者无疑在易操作性上更胜一筹。但是为什么又有那么多的爱好者钟情于Linux呢,当然自由是最吸引人的一点,另外Linux强大的功能也是一个非常重要的原因,尤其是Linux强大的网络功能更是引人注目。放眼今天的WAP业务、银行网络业务和曾经红透半边天的电子商务,都越来越倚重基于Linux的解决方案。因此Linux网络编程是非常重要的,而且当我们一接触到Linux网络编程,我 阅读全文
posted @ 2011-07-27 09:07 hnrainll 阅读(658) 评论(0) 推荐(0)
摘要:If you're new to Linux and looking for a great BitTorrent client, you're in luck. Linux has a fantastic variety of BitTorrent clients and we've picked out five of the best Linux BitTorrent clients you'll find today. When many people talk about BitTorrent, they probably think of downl 阅读全文
posted @ 2011-07-27 06:42 hnrainll 阅读(764) 评论(0) 推荐(0)
摘要:BT种子文件使用了一种叫bencoding的编码方法来保存数据。bencoding现有四种类型的数据:srings(字符串),integers(整数),lists(列表),dictionaries(字典)编码规则如下:strings(字符串)编码为:<字符串长度>:<字符串>例如: 4:test 表示为字符串test 4:例子 表示为字符串“例子”字符串长度单位为字节没开始或结束标记integers(整数)编码为:i<整数>e开始标记i,结束标记为e例如: i1234e 表示为整数1234 i-1234e 表示为整数-1234整数没有大小限制 i0e 表示为 阅读全文
posted @ 2011-07-26 17:09 hnrainll 阅读(18904) 评论(0) 推荐(0)
摘要:/* ************************************************************************ * Filename: main.c * Description: * Version: 1.0 * Created: 2011年07月26日 12时27分27秒 * Revision: none * Compiler: gcc * Author: YOUR NAME (), * Company: * ************************************************************************ 阅读全文
posted @ 2011-07-26 12:31 hnrainll 阅读(1734) 评论(0) 推荐(0)
摘要:值-结果参数(socket编程中一到七的structsockaddr_in的长度参数)1.概念:当函数参数是从内核到进程时,函数被调用时参数大小是一个值,它告诉内核该参数的结构大小避免内核写操作越界,函数返回时,参数的结构大小又是一个结果,它告诉进程内核写进数据的多少,这种参数叫做值-结果参数。2.例子:八个socket编程中涉及的函数中,总是通过指针来传递指向结构的指针。同时结构的长度也作为参数来传递,但是其传递的方法取决于结构的传递方向:侍从内核到进程还是从进程到内核。详细如下:1>.参数从进程到内核:bind、connect从进程到内核传递参数,它明确知道要拷贝多少以及拷贝的数据。 阅读全文
posted @ 2011-07-25 21:37 hnrainll 阅读(638) 评论(0) 推荐(0)
摘要:高位字节优先和低位字节优先。Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换。第一个结构类型是:struct sockaddr 该类型是用来保存socket信息的structsockaddr{ unsigned shortsa_family; /* 地址族, AF_xxx */ charsa_data[14]; /* 14 字节的协议地址 */};sa_family一般为AF_INET;sa_data则包含该socket的IP地址和端口号。另外还有一种结构类型:structsockaddr_in 阅读全文
posted @ 2011-07-25 21:31 hnrainll 阅读(1157) 评论(0) 推荐(0)
摘要:我们已经知道,当把套接口地址传递给套接口函数时,总是通过指针传递的,即传递的是一个指向结构的指针。结构的长度也作为参数来传递,其传递的方式取决于结构的传递的方向:从进程到内核,还是从内核到进程。 1、从进程到内核传递的套接口结构有3个函数:bind,connect和sendto,这三个函数的一个参数是指向套接口结构的指针,另一个是结构的大小,如:structsockaddr_inserv;/*fill in serv[]*/connect(sockfd,(SA*)&serv,sizeof(serv)); 由于从进程到内核的参数是指向结构的指针和结构的大小,所以从进程到内核拷贝的数据是确 阅读全文
posted @ 2011-07-25 21:30 hnrainll 阅读(2037) 评论(0) 推荐(0)
摘要:描述popen() 函数 用 创建管道 的 方式启动一个 进程, 并调用 shell. 因为 管道是被定义成单向的, 所以 type 参数 只能定义成 只读或者 只写, 不能是 两者同时, 结果流也相应的 是只读 或者 只写. command 参数 是 一个 字符串指针, 指向的是一个 以 null 结束符 结尾的字符串, 这个字符串包含 一个 shell 命令. 这个命令 被送到 /bin/sh 以 -c 参数 执行, 即由 shell 来执行. type 参数 也是 一个 指向 以 null 结束符结尾的 字符串的指针, 这个字符串 必须是 'r' 或者 'w’ 来 阅读全文
posted @ 2011-07-23 14:44 hnrainll 阅读(46442) 评论(1) 推荐(0)
摘要:1、简介在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是:#include <unistd.h>extern char **environ;int execl(const char *path, const char *arg, ...);int execlp(const char *file, const char *arg, ...);int execle(const char *path, const char *arg, ..., char * const envp[]);int execv(const char *path, char 阅读全文
posted @ 2011-07-23 14:41 hnrainll 阅读(24281) 评论(0) 推荐(1)
摘要:SOCKET()我们使用系统调用socket()来获得文件描述符:#include<sys/types.h>#include<sys/socket.h>int socket(int domain,int type,int protocol);第一个参数domain设置为“AF_INET”。第二个参数是套接口的类型:SOCK_STREAM或SOCK_DGRAM。第三个参数设置为0。系统调用socket()只返回一个套接口描述符,如果出错,则返回-1。bind()一旦你有了一个套接口以后,下一步就是把套接口绑定到本地计算机的某一个端口上。但如果你只想使用connect()则 阅读全文
posted @ 2011-07-22 12:30 hnrainll 阅读(13106) 评论(1) 推荐(3)
摘要:1 SHA1算法简介安全哈希算法(Secure HashAlgorithm)主要适用于数字签名标准(Digital SignatureStandard DSS)里面定义的数字签名算法(DigitalSignature AlgorithmDSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要。2 术语和概念2.1位(Bit),字节(Byte)和字(Word)SH 阅读全文
posted @ 2011-07-22 10:58 hnrainll 阅读(8399) 评论(0) 推荐(0)
摘要:如果你需要在Linux中操作windows下的文件,那么你可能会经常遇到文件编码转换的问题。Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8。下面介绍一下,在Linux中如何查看文件的编码及如何进行对文件进行编码转换。查看文件编码在Linux中查看文件编码可以通过以下几种方式:1.在Vim 中可以直接查看文件编码Shell代码 :setfileencoding即可显示文件编码格式。如果你只是想查看其它编码格式的文件或者想解决用Vim查看文件乱码的问题,那么你可以在~/.vimrc 文件中添加以下内容:Shell代码 setencoding=utf-8fil 阅读全文
posted @ 2011-07-22 09:47 hnrainll 阅读(113148) 评论(2) 推荐(2)
摘要:HTTP协议是什么?简单来说,就是一个基于应用层的通信规范:双方要进行通信,大家都要遵守一个规范,这个规范就是HTTP协议。HTTP协议能做什么?很多人首先一定会想到:浏览网页。没错,浏览网页是HTTP的主要应用,但是这并不代表HTTP就只能应用于网页的浏览。HTTP是一种协议,只要通信的双方都遵守这个协议,HTTP就能有用武之地。比如咱们常用的QQ,迅雷这些软件,都会使用HTTP协议(还包括其他的协议)。HTTP协议如何工作?大家都知道一般的通信流程:首先客户端发送一个请求(request)给服务器,服务器在接收到这个请求后将生成一个响应(response)返回给客户端。在这个通信的过程中H 阅读全文
posted @ 2011-07-22 08:58 hnrainll 阅读(294) 评论(0) 推荐(0)
摘要:fseek函数是用来设定文件的当前读写位置.函数原型: int fseek(FILE*fp,long offset,int origin);函数功能:把fp的文件读写位置指针移到指定的位置.fseek(fp,20,SEEK_SET);意思是把fp文件读写位置指针从文件开始后移20个字节.ftell函数是用来获取文件的当前读写位置;函数原型:long ftell(FILE *fp)函数功能:得到流式文件的当前读写位置,其返回值是当前读写位置偏离文件头部的字节数.ban=ftell(fp);是获取fp指定的文件的当前读写位置,并将其值传给变量ban.fseek函数与ftell函数综合应用:分析:可 阅读全文
posted @ 2011-07-21 16:46 hnrainll 阅读(2780) 评论(0) 推荐(1)
摘要:ANSIC标准定义了以下6种可供C语言使用的预定义宏:__LINE__ 在源代码中插入当前源代码行号__FILE__ 在源代码中插入当前源代码文件名__DATE__ 在源代码中插入当前编译日期〔注意和当前系统日期区别开来〕__TIME__ 在源代码中插入当前编译时间〔注意和当前系统时间区别开来〕 __STDC__ 当要求程序严格遵循ANSIC标准时该标识符被赋值为1。__cplusplus标识符__LINE__和__FILE__通常用来调试程序;标识符__DATE__和__TIME__通常用来在编译后的程序中加入一个时间标志,以区分程序的不同版本;当要求程序严格遵循ANSIC标准时,标识符__ 阅读全文
posted @ 2011-07-21 16:20 hnrainll 阅读(1484) 评论(0) 推荐(0)
摘要:torrent文件信息存储格式:bencoding是一种以简洁格式指定和组织数据的方法。支持下列类型:字节串、整数、列表和字典。1 字符串存储格式: <字符串的长度>:<字符串的内容> 例如: 4:spam 表示spam, 2:ab 表示ab2 数字的存储格式: i<整数>e例如: i3e 表示整数3, i1024e 表示整数10243 列表的存储格式: l<子元素>e 其中:子元素可以是字符串,整数,列表和字典,或者是它们的组合体例如: l4:spam4:eggse 表示 [ "spam", "eggs" 阅读全文
posted @ 2011-07-21 14:43 hnrainll 阅读(6767) 评论(1) 推荐(0)
摘要:字符串:字符串被如此编码:<字符串长度>:字符串正文.这种表示法没有任何的分界符.例子:如"8:announce"指"announce".整数:整数被如此编码:<i>整数值<e>.可以为负数,如'i-3e'例子:'i3e' 指 3.列表:列表是如此被表示的:<l>Bencode Value<e>,列表可以用来表示多个对象.列表内容可以包括字符串,整数,字典,甚至列表本身.例子:'l4:spam4:eggse' 指 [ "spam" 阅读全文
posted @ 2011-07-21 14:37 hnrainll 阅读(5784) 评论(0) 推荐(2)
摘要:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>int main(int argc, char *argv[]){ char buf[100]; char str[20] = "helloworld 100"; int num; sscanf(str,"%s %d",buf,&num); printf("the buf:%s %d\n",buf,num); return 0;}和 阅读全文
posted @ 2011-07-18 14:26 hnrainll 阅读(2237) 评论(0) 推荐(1)
摘要:#include <stdio.h>#include <stdlib.h>#include <unistd.h>int main(int argc, char *argv[]){char out_buf[100];char *str="hello world";int num=110;sprintf(out_buf,"%s.%d",str,num);printf("%s\n",out_buf);return 0;} sprintf和printf的不同点:printf是将数据打印到标准输出中.spri 阅读全文
posted @ 2011-07-18 12:41 hnrainll 阅读(2744) 评论(1) 推荐(0)
摘要:最近在看网络编程部分内容,刚开始接触结构体struct sockaddr和struct sockaddr_in的时候,极其迷惑,在网上翻了不少帖子,慢慢有那么点清晰了。呵呵,现在结合一篇网友的文章,对这两个结构体进行解读。在linux环境下,结构体struct sockaddr在/usr/include/linux/socket.h中定义,具体如下:typedef unsigned short sa_family_t;struct sockaddr { sa_family_t sa_family; /* address family, AF_xxx */ char sa_data[14]; / 阅读全文
posted @ 2011-07-18 12:32 hnrainll 阅读(14997) 评论(0) 推荐(0)
摘要:/* ************************************************************************ * Filename: open.c * Description: * Version: 1.0 * Created: 2011年07月18日 18时54分51秒 * Revision: none * Compiler: gcc * Author: YOUR NAME (), * Company: * ************************************************************************ 阅读全文
posted @ 2011-07-18 12:20 hnrainll 阅读(2430) 评论(2) 推荐(0)
摘要:Setting the Application Icon on WindowsFirst, create an ICO format bitmap file that contains the icon image. This can be done with e.g. Microsoft Visual C++: Select File|New, then select the File tab in the dialog that appears, and choose Icon. (Note that you do not need to load your application int 阅读全文
posted @ 2011-07-15 09:20 hnrainll 阅读(1762) 评论(0) 推荐(0)
摘要:Qt的元对象系统基于如下三件事情:1.类:QObject,为所有需要利用原对象系统的对象提供了一个基类。2.宏:Q_OBJECT,通常可以声明在类的私有段中,让该类可以使用元对象的特性,比如动态属性,信号和槽。3.编译器:元对象编译器(moc)为每个QObject子对象自动生成必要的代码来实现元对象特性。moc工具会读入C++的源文件,如果它发现了一个或者多个声明了Q_OBJECT宏的类,它就创建另一个C++源文件,为每个类生成包含元对象实现的代码。这些编译生成的源文件通常都已经被包含到类的源文件中或者和类的实现同时被编译和链接。除了为对象间的通信提供信号和槽(signals and slot 阅读全文
posted @ 2011-07-12 15:37 hnrainll 阅读(8189) 评论(0) 推荐(2)
摘要:众所周知,在电话通讯中,电话用户是靠电话号码来识别的。同样,在网络中为了区别不同的计算机,也需要给计算机指定一个号码,这个号码就是“IP地址”。 ★什么是IP地址 所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。 按照TCP/IP(Transport Control Protocol/Internet Protocol,传输控制协议/Internet协议)协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。例如一个采用二进制形式的IP地址是“00001010000000000000000000000001”,这么长的地址,人们 阅读全文
posted @ 2011-07-08 06:33 hnrainll 阅读(7137) 评论(0) 推荐(0)
摘要:KERNELDIR = /home/wenhao/platform/linux-2.6.34PWD := $(shell pwd)CROSS_COMPILE = /usr/local/arm/4.3.2/bin/arm-linux-CC = $(CROSS_COMPILE)gccobj-m := key.o modules: $(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions.PHONY: modules clean 阅读全文
posted @ 2011-07-07 15:57 hnrainll 阅读(4957) 评论(0) 推荐(0)
摘要:在C语言中,函数参数的传递方式有值传和址传.值传是把实参的一个专用的、临时的复制值给被调函数中相应的形参被调用函数使用、修改这个传来的复制值,不会影响实参的值.址传则是把变量(实参)的地址传给被调函数.被调函数通过这个地址找到该变量的存放位置,直接对该地址中存放的变量的内容进行存取操作.因此,在被调用函数中可以修改实参的值.这也是函数参数址传的优点.无论是值传还是址传,都要求实参的数目及类型与形参要完全一致.在一般的程序设计语言中,函数参数的数目及类型是不可变的.即函数被设计之后,只能接收已固定个数和固定类型的实参.这样在编译时,函数形参的存储空间便于确定.但是在C语言中,不但参数的类型可变, 阅读全文
posted @ 2011-07-06 19:10 hnrainll 阅读(469) 评论(0) 推荐(0)
摘要:1 函数声明 首先,要实现类似printf()的变参函数,函数的最后一个参数要用 ... 表示,如 int log(char * arg1, ...)这样编译器才能知道这个函数是变参函数。这个参数与变参函数的内部实现完全没有关系,只是让编译器在编译调用此类函数的语句时不计较参数多少老老实实地把全部参数压栈而不报错,当然...之前至少要有一个普通的参数,这是由实现手段限制的。2 函数实现 C语言通过几个宏实现变参的寻址。下面是linux2.18内核源码里这几个宏的定义,相信符合C89,C99标准的C语言基本都是这样定义的。 typedef char *va_list;/* Storage ali 阅读全文
posted @ 2011-07-06 19:09 hnrainll 阅读(5959) 评论(1) 推荐(1)
摘要:在c/c++标准库中,变参函数很特别。printf, fprintf, sprintf等都属于变参函数。如果自己要写类似的参数可变的函数,通常会用到下面三个函数: #include <stdarg.h>void va_start(va_list ap, last);type va_arg(va_list ap, type);void va_end(va_list ap);一般的用法是这样:va_list args; //声明变量va_start(args, fmt); //开始解析。args指向fmt后面的参数TYPE var = va_arg(args, TYPE); //取下一 阅读全文
posted @ 2011-07-06 19:05 hnrainll 阅读(1399) 评论(0) 推荐(0)
摘要:C语言中的移位操作,内容不多。不过有些地方你不注意,就疏忽了。 先做两个小题先。 (1)unsigned char x=3; x>1是多少? (2)char x=3; x>1是多少? (3)char x=-3; x>1是多少? 3写成二进制数是00000011;-3写成二进制数是(补码)11111101。 程序执行的时候,操作的是数值的编码表示,也就是数值在内存中的二进制表示。比如说,程序取-3的时候,就去取11111101。 (1)对无符号数3来说,x>1往右边移一位,由于是无符号数,所以逻辑右移,最右边一位移掉,最左边移进来的位补零,变成00000001,所以结果是 阅读全文
posted @ 2011-07-06 14:06 hnrainll 阅读(637) 评论(0) 推荐(0)
摘要:在C语言中,涉及位移的运算符有2个,>>表示右移,<<则表示左移。而汇编指令中,SHL和SHR表示逻辑左移和逻辑右移,SAR和SAL表示算术左移和算术右移。其中,逻辑左移和算术左移都是寄存器二进制位整体向左移动,并在右边补0。而右移则不同,逻辑右移是整体向右移,并在左边补0,而算术左移则是根据原符号位的值补与其相同的值。那么如何在C语言中分别实现逻辑和算术位移呢?根据C标准,如果在位移运算符左边的变量是有符号数,如int,char,short等,编译产生的汇编指令是算术位移指令,如果该变量是无符号数,如unsigned int,unsigned char等,编译产生的汇 阅读全文
posted @ 2011-07-06 12:05 hnrainll 阅读(5917) 评论(0) 推荐(0)
摘要:引自 http://topic.csdn.net/t/20010521/10/128376.htmlint型变量有时候占4个字节(在Win32),有时候占2个字节(在DOS) 这个int类型的大小到底是跟编译器有关,还是跟CPU有关,还是跟操作系统有关?所谓的16位32位64位系统是由cpu决定的,由机器指令的寻址、寄存器位数决定的 os受cpu的限制,但在32位的cpu下16位的os也可以跑(就向上面提到的所谓纯dos) 很多os是向前兼容的,就是使以前的程序也能运行,如果编译器本身是16位时代做的,那么os会提供一个模拟16位的子环境供这个编译器使用 int和void*长度应该是一样的(1 阅读全文
posted @ 2011-07-06 11:06 hnrainll 阅读(28143) 评论(2) 推荐(0)
摘要:FrameBufferFrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口。这种接口将显示设备抽象为帧缓冲区。用户可以将它看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。该驱动程序的设备文件一般是 /dev/fb0、/dev/fb1 等等。比如,假设现在的显示模式是1024x768-8 位色,则可以通过如下的命令清空屏幕:$ dd if=/dev/zero of=/dev/fb0 bs=1024 count=768在应用程序中,一般通过将 FrameBuffer 设备映射到进程地址空间的方式使用,比如下面的程序就 阅读全文
posted @ 2011-07-05 20:31 hnrainll 阅读(863) 评论(0) 推荐(1)
摘要:飞鸽传书中文源码 下载地址:http://www.azhi.net/blog/article.asp?id=35 阅读全文
posted @ 2011-07-05 15:15 hnrainll 阅读(1758) 评论(0) 推荐(0)
摘要:IP Messenger是一款局域网内部聊天、文件传输工具,具有很多优点,如数据通讯不需要建立服务器、直接在两台电脑间通信和数据传输,支持文件及文件目录的传输,安全快捷以及小巧方便等优异特点,因此很多公司都采用它作为部门、公司内部的IM即时通信工具。 IP Messenger在程序结构方面采用了Windows SDK处理结构,通信方面采用了TCP/UDP通信方式,在文件传输处理方面采用文件映射技术,等等。通过分析IP Messenger的运行、工作原理,可以提高并加深对Windows处理流程的理解,提高SOCKET编程技术等,因此特对其源码进行分析,以抛砖引玉,共同提高大家的编程技术。 1、I 阅读全文
posted @ 2011-07-05 15:14 hnrainll 阅读(6511) 评论(1) 推荐(0)
摘要:有些时候,我们需要在终端启动一个程序,并使之运行——但是如果关闭终端,那么这个程序也就随着关闭了。那么有没有什么方法在关闭终端后,让已经从这个终端启动的程序继续运行呢?前置知识:xterm,console,tty,pts,pty的区别shell是直接和内核进行通信的东西xterm是一个软件概念,可以通过这个程序连接到console从而控制主机,可以理解为cli形式的终端模拟器,而gnome-terminal,konsole就是gui形式的终端模拟器console是主机的控制台,是一个物理概念。tty、pty、pts都是终端,是硬件或者设备概念。tty是所有终端设备的总称pty是其中一类,伪终端 阅读全文
posted @ 2011-07-04 14:48 hnrainll 阅读(87479) 评论(1) 推荐(1)
摘要:nohup命令参考用途不挂断地运行命令。语法nohup Command [ Arg ... ] [ & ]描述nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打 阅读全文
posted @ 2011-07-04 14:48 hnrainll 阅读(1092) 评论(0) 推荐(0)
摘要:问题: VMware里安装RedHat Linux时出现:出现错误-未找到要在其中创建新文件系统的有效设备。请检查您的硬件以找到问题的起因。原因: VM默认硬盘是SCSI硬盘(安装VMware安装的时候选择Custom安装是可以选择),而SCSI硬盘需要专门的驱动,windows系统带有,而read hat没有,所以会出现未找到要在其中创建新文件系统的有效设备的错误提示。解决方法: 把原来的scsi硬盘删除,新建一个IDE硬盘,就可以了 在Favorites(虚拟机)单击你要处理的计算机–>Edit vitual machine settings(设置)–-->单击 “Hard D 阅读全文
posted @ 2011-07-03 22:39 hnrainll 阅读(629) 评论(0) 推荐(0)
摘要:这几天在用libvlc的时候看到它在terminal里面输出彩色字体觉得挺好玩的,以为是用ncurses实现的,后来一查原来用ANSI C的转义字符就可以实现,不过好现只在linux下有效吧, windows神马的貌似不行,把项目终端凌乱的输出信息整理了一下,关键字符也都用彩色显示,看上去舒服多了,写一下用法以防止以后忘了再去查。先把控制码列出来(从网上搜来的):\033[0m 关闭所有属性\033[1m 设置高亮度\033[4m 下划线\033[5m 闪烁\033[7m 反显\033[8m 消隐\033[30m----\33[37m 设置前景色\033[40m----\33[47m 设置背景 阅读全文
posted @ 2011-07-01 20:16 hnrainll 阅读(8833) 评论(0) 推荐(2)
摘要:Linux Shell的输入彩色字体文本终端的颜色可以使用“ANSI非常规字符序列”来生成。举例: echo -e "\033[44;37;5m ME \033[0m COOL"以上命令设置背景成为蓝色,前景白色,闪烁光标,输出字符“ME”,然后重新设置屏幕到缺省设置,输出字符 “COOL”。“e”是命令 echo 的一个可选项,它用于激活特殊字符的解析器。“\033”引导非常规字符序列。“m”意味着设置属性然后结束非常规字符序列,这个例子里真正有效的字符是 “44;37;5” 和“0”。修改“44;37;5”可以生成不同颜色的组合,数值和编码的前后顺序没有关系。可以选择的 阅读全文
posted @ 2011-07-01 20:14 hnrainll 阅读(1364) 评论(0) 推荐(1)
摘要:S3C2440A 中的中断控制器可以从60 个中断源接收中断请求。这些中断源由内部外设提供,例如DMA 控制器、UART、IIC 等。在这些中断源中,UARTn、AC97 和外部中断EINTn 对于中断控制器来说是或逻辑。当接收来自内部外设和外部中断请求引脚的多个中断请求时,在仲裁过程后中断控制器请求ARM920T 的FIR 或IRQ 中断。仲裁过程依赖于硬件优先级逻辑且其结果写入中断未决寄存器,其帮助用户通报那些由不同中断源生成的中断。14.1 中断控制器操作14.1.1 程序状态寄存器(PSR)的F 位和L 位如果在ARM920T 的CPU 中的程序状态寄存器的F 位置1,CPU 不能接收 阅读全文
posted @ 2011-07-01 17:02 hnrainll 阅读(1299) 评论(0) 推荐(0)
摘要:全局变量jiffies用来记录自系统启动以来产生的节拍的总数。启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量的值。一秒内时钟中断的次数等于Hz,所以jiffies一秒内增加的值也就是Hz。 系统运行时间以秒为单位,等于jiffies/Hz。注意,jiffies类型为无符号长整型(unsigned long),其他任何类型存放它都不正确。将以秒为单位的时间转化为jiffies:seconds * Hz将jiffies转化为以秒为单位的时间:jiffies / Hz相比之下,内核中将秒转换为jiffies用的多些。 jiffies的内部表示 jiffies定义于文件< 阅读全文
posted @ 2011-07-01 16:49 hnrainll 阅读(892) 评论(0) 推荐(0)
摘要:Linux2.6内核驱动移植参考 随着Linux2.6的发布,由于2.6内核做了教的改动,各个设备的驱动程序在不同程度上要 进行改写。为了方便各位Linux爱好者我把自己整理的这分文档share出来。该文当列举 了2.6内核同以前版本的绝大多数变化,可惜的是由于时间和精力有限没有详细列出各个 函数的用法。 特别声明:该文档中的内容来自http:/lwn.net,该网也上也有各个函数的较为详细的 说明可供各位参考。如果需要该文档的word版的朋友, 请mail到jlpan82@gmail.com索 取。 1、 使用新的入口 必须包含 <linux/init.h> module_ini 阅读全文
posted @ 2011-07-01 16:45 hnrainll 阅读(2847) 评论(0) 推荐(0)
摘要:Linux HZLinux核心几个重要跟时间有关的名词或变数,底下将介绍HZ、tick与jiffies。HZLinux核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每一秒有几次timer interrupts。举例来说,HZ为1000,代表每秒有1000次timer interrupts。 HZ可在编译核心时设定,如下所示(以核心版本2.6.20-15为例): adrian@adrian-desktop:~$ cd /usr/src/linux adrian@adrian-desktop:/usr/src/linux$ make menuconfig Pr 阅读全文
posted @ 2011-07-01 16:37 hnrainll 阅读(3928) 评论(0) 推荐(0)
摘要:中断处理: 中断是嵌入式里最重要的一个概念。一般一个系统对于一个设备要么采用中断方式,要么采用轮询方式 。中断方式可以有效地减少处理器负荷 ,但是如果大量采用中断则有可能降低处理速度 ,因为中断处理破坏了处理器的流水机制。复习下微机原理中中断处理过程和中断机制。 2440中支持FIQ(快速中断)和IRQ(普通中断)2种中断方式,一般只采用IRQ中断。2440有60个中断源,不支持中断嵌套。具体的参考用户手册第14章。下图是2440中断产生过程。具体的讲解一下,关于寄存器请查阅用户手册。 中断源分为2种,子中断中断源和中断源,当一个子中断产生一个中断信号,子中断源挂起寄存器(SUBRCPND)相 阅读全文
posted @ 2011-07-01 14:03 hnrainll 阅读(1327) 评论(0) 推荐(0)
摘要:ioctl函数本函数影响由fd参数引用的一个打开的文件。#include<unistd.h>intioctl( int fd, int request, .../* void *arg */ );返回0:成功 -1:出错第三个参数总是一个指针,但指针的类型依赖于request参数。我们可以把和网络相关的请求划分为6类:套接口操作文件操作接口操作ARP高速缓存操作路由表操作流系统下表列出了网络相关ioctl请求的request参数以及arg地址必须指向的数据类型:类别Request说明数据类型套接口SIOCATMARKSIOCSPGRPSIOCGPGRP是否位于带外标记设置套接口的进 阅读全文
posted @ 2011-07-01 11:42 hnrainll 阅读(3178) 评论(0) 推荐(0)