随笔分类 -  C

摘要:一、相关概念的介绍什么是Makefile?怎么书写Makefile?竟然有工具可以自动生成Makefile?怎么生成啊?开始的时候,我有这么多疑问,所以,必须得先把基本的概念搞个清楚。1.Makefile makefile用来定义整个工程的编译规则。一个工程中的源文件计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。 makefile带来的好处就是——“自动化编译”,一旦写好,只需要.. 阅读全文
posted @ 2013-01-06 09:23 hnrainll 阅读(4274) 评论(1) 推荐(1)
摘要:常常在Linux中操作windows下的文件时,会遇到乱码的情形。常见的比如在Visual Studio 中写的C\C++程序需要放到Linux主机上编译,而程序的中文注释则显示为乱码,比较严重的是由于编码原因,linux上的编译器报错。这是由于Windows中默认的文件格式是GBK(gb2312),而Linux一般都是UTF-8。那么如何在Linux中如何查看文件的编码及如何进行对文件进行编码转换呢?1、用VIM查看文件编码在Vim 中可以直接查看文件编码:set fileencoding即可显示文件编码格式。2、 改写~/.vimrc 文件如果你只是想查看其它编码格式的文件或者想解决用Vi 阅读全文
posted @ 2012-11-22 23:15 hnrainll 阅读(8872) 评论(1) 推荐(1)
摘要:当我们使用C的库函数读取文件时,会有文本模式和二进制模式两种读取模式。一些传输数据的协议比如TFTP、FTP也有文本和二进制模式的区分。既可以使用文本模式也可以使用二进制模式时,尽量使用二进制模式。文本模式和二进制模式读取文件时,差别主要是在回车换行的处理上,不同系统对回车换行的处理不一致。CR:Carriage Return,0X0D,“/r”LF:Line Feed,0X0A,“/n”Dos和windows采用回车+换行(CR+LG)表示下一行UNIX采用换行符(LF)表示下一行MAC机采用回车符(CR)表示下一行Unix、Linux的C的库函数处理文件时不区分文本和二进制,但是Windo 阅读全文
posted @ 2012-11-22 14:40 hnrainll 阅读(602) 评论(0) 推荐(1)
摘要:C语言宏中"#"和"##"的用法在查看linux内核源码的过程中,遇到了许多宏,这里面有许多都涉及到"#"和"##",因此,在网上搜索了一些资料,整理如下:一、一般用法我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.用法:#include<cstdio>#include<climits>usingnamespacestd;#defineSTR(s)#s#defineCONS(a,b)int(a##e##b)intmain(){printf(STR(vck));//输出字符串& 阅读全文
posted @ 2012-08-15 18:03 hnrainll 阅读(16684) 评论(2) 推荐(5)
摘要:/* ************************************************************************ * Filename: main.c * Description: * Version: 1.0 * Created: 2011年12月14日 20时40分36秒 * Revision: none * Compiler: gcc * Author: YOUR NAME (), * Company: * ***********... 阅读全文
posted @ 2011-12-14 21:02 hnrainll 阅读(656) 评论(0) 推荐(0)
摘要:传值调用并不能改变两个变量的值,而传址能。为什么,因为,传值调用,仅仅是在函数内,调换参数的值。而地址所指向的值,改变的不仅仅是函数内,函数外也改变。请看代码:这里还要注意:通常我们不会返回局部变量的地址./* ************************************************************************ * Filename: main.cc * Description: * Version: 1.0 * Created: 2011年12月14日 17时06分13秒 * Re... 阅读全文
posted @ 2011-12-14 20:38 hnrainll 阅读(5598) 评论(0) 推荐(0)
摘要:C/C++语言void及void指针深层探索 1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。 2.void的含义 void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。 void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义: void a; 这行语句编译时会出错,提示“illegal use of type ‘void‘”。不过... 阅读全文
posted @ 2011-11-27 14:35 hnrainll 阅读(767) 评论(1) 推荐(3)
摘要:【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 自10月初编写算法系列的博客以来,陆陆续续以来写了几十篇。按照计划,还有三个部分的内容没有介绍,主要是(Dijkstra算法、二叉平衡树、红黑树)。这部分会在后面的博客补充完整。这里主要是做一个总结,有兴趣的朋友可以好好看看,欢迎大家提出宝贵意见。 (1) 排序算法 快速排序 合并排序堆排序选择排序 基数排序 冒泡排序 插入排序 希尔排序 链表排序 (2) 数据结构 线性队列 线性堆栈单向链表双向链表 循环单向链表排序二叉树(插入,删除上、中、下、保存和加载)哈希表 哈希二叉树 (3)图.. 阅读全文
posted @ 2011-11-23 09:29 hnrainll 阅读(1454) 评论(1) 推荐(1)
摘要:应一些朋友的要求,我把我电脑上的源代码全部张贴到这里。当然稍微做些说明。这样有个好处就是我自己可以通过google随时搜索源代码例子,比如我想找udp编程的例子时,我就在google里输入:udp site:zhoulifa.bokee.com搜索,能看到我自己的源代码例子。下面这个例子用fnmatch函数进行字符通配,比如匹配*、?等字符。/************关于本文档*********************************************filename: fnmatch.c*purpose: 说明用fnmatch进行字符匹配的方法*wrote by: zhouli 阅读全文
posted @ 2011-10-24 15:43 hnrainll 阅读(6781) 评论(0) 推荐(0)
摘要:首先简要阐述关于gcc、glibc和 binutils模块之间的关系一、关于gcc、glibc和binutils模块之间的关系1、gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运行库的支持,如 libgcc_s.so、libstdc++.so等。2、binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编 (objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。通常,binutil 阅读全文
posted @ 2011-10-21 11:55 hnrainll 阅读(3717) 评论(0) 推荐(0)
摘要:没找到objdump的输出格式解释的文档,只能自己猜测了。objdump打印符号表的格式:shenyan@ubuntu:~/Temp$ objdump -t a.oa.o: file format elf32-i386SYMBOL TABLE:00000000l df *ABS*00000000 a.c00000000l d .text00000000 .text00000000 l d .data00000000 .data00000000 l d .bss00000000 .bss00000000 l d .note.GNU-stack00000000 .note.GNU-stack000 阅读全文
posted @ 2011-10-21 11:54 hnrainll 阅读(6611) 评论(0) 推荐(0)
摘要:函数名: abort 功 能: 异常终止一个进程 用 法: void abort(void);程序例: #include <stdio.h> #include <stdlib.h> int main(void) { printf("Calling abort()\n"); abort(); return 0; /* This is never reached */ } 阅读全文
posted @ 2011-10-10 21:43 hnrainll 阅读(756) 评论(0) 推荐(0)
摘要:<stdio.h>中定义了perror(),perror是在标准输出上输出msg字符串,然后再后面加上:错误语段(这个错误语段对应这时的errno) <string.h>中定义了strerror(),strerror是把一个错误numb作为参数,然后返回错误numb所对应的错误语段,一般用errno。#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <string.h>#include <errno.h>int main(in 阅读全文
posted @ 2011-09-30 13:33 hnrainll 阅读(2347) 评论(0) 推荐(0)
摘要:fopen /open区别UNIX环境下的C对二进制流文件的读写有两套班子:1) fopen,fread,fwrite ; 2) open, read, write这里简单的介绍一下他们的区别。1. fopen系列是标准的C库函数;open系列是POSIX定义的,是UNIX系统里的system call。也就是说,fopen系列更具有可移植性;而open系列只能用在POSIX的操作系统上。2.使用fopen系列函数时要定义一个指代文件的对象,被称为“文件句柄”(file handler),是一个结构体;而open系列使用的是一个被称为“文件描述符”(file descriptor)的int型整 阅读全文
posted @ 2011-09-16 14:19 hnrainll 阅读(1598) 评论(0) 推荐(0)
摘要:int open(const char *path, int access,int mode) path 要打开的文件路径和名称 access 访问模式,宏定义和含义如下: O_RDONLY 1 只读打开 O_WRONLY 2 只写打开 O_RDWR 4 读写打开 还可选择以下模式与以上3种基本模式相与: O_CREAT 0x0100 创建一个文件并打开 O_TRUNC 0x0200 打开一个已存在的文件并将文件长度设置为0,其他属性保持 O_EXCL 0x0400 未使用 O_APPEND 0x0800 追加打开文件 O_TEXT 0x4000 打开文本文件翻译CR-LF控制字符 O_BIN 阅读全文
posted @ 2011-09-16 14:14 hnrainll 阅读(35611) 评论(1) 推荐(2)
摘要:open和fopen的区别:主要区别是涉及到系统,而不是缓冲。带f的是标准IO,代码可以移植。不带f只能在UNIX/LINUX系统调用。 open一个是整数,fopen一个是指针(FILE *)。 二者区别大致可以总结为以下几点:1,fread是带缓冲的,read不带缓冲.2,fopen是标准c里定义的,open是POSIX中定义的.3,fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别.4,fopen不能指定要创建文件的权限.open可以指定权限.5,fopen返回指针,open返回文件描述符(整数).6,linux/unix中任何设备都是文件,都可以用op 阅读全文
posted @ 2011-09-16 14:08 hnrainll 阅读(1084) 评论(0) 推荐(0)
摘要:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <fcntl.h>#include <sys/select.h>int main(int argc,char *argv[]){ char buf[100] = ""; fd_set rset; //select集合 FD_ZERO(&rset); //将集合清0 FD_SET(0, &rset); //将标准输入加入到集 阅读全文
posted @ 2011-08-26 21:32 hnrainll 阅读(446) 评论(0) 推荐(0)
摘要:C语言中局部变量和全局变量 变量的存储类别(static,extern,auto,register) 局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元,调用结束立即释放。这一点表明形参变量只有在函数内才是有效的,离开该函数就不能再使用了。这种变量有效性的范围称变量的作用域。不仅对于形参变量,C语言中所有的量都有自己的作用域。变量说明的方式不同,其作用域也不同。C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。8.8.1 局部变量 局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。例 阅读全文
posted @ 2011-08-26 20:10 hnrainll 阅读(7583) 评论(1) 推荐(2)
摘要:进程就好比人一样有其生命,我们通过fork()函数来创建一个进程,那么我们又是如何来中止进程呢。 进程退出 1.在Linux中任何让一个进程退出 进程退出表示进程即将结束。在Linux中进程退出分为了正常退出和异常退出两种。 1>正常退出 a. 在main()函数中执行return 。 b.调用exit()函数 c.调用_exit()函数 2>异常退出 a.调用about函数 b.进程收到某个信号,而该信号使程序终止。 Tiger-John说明:不管 是那种 退出方式,系统最终都会执行内核中的同一代码。这段代码用来关闭进程所用已打开的文件描述符,释放它所占用的内存和其他资源。 3& 阅读全文
posted @ 2011-08-17 08:55 hnrainll 阅读(31156) 评论(5) 推荐(5)
摘要:1、open 是系统调用 返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引,fopen是C的库函数,返回的是一个指向文件结构的指针。2、fopen的实现要调用open, 关键看你想返回什么了, FILE指针还是描述符? 3、32位环境下,编译加“-D_FILE_OFFSET_BITS=64” 要在open里加O_LARGEFILE标记 [code]static int ext2_open_file (struct inode * inode, struct file * filp){ if (!(filp->f_flags & O_LARGEFILE) && 阅读全文
posted @ 2011-08-16 17:57 hnrainll 阅读(3207) 评论(1) 推荐(0)