摘要:
Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。可以参考《Linux程序设计》(英文原版为《Beginning Linux Programming》,作者是Neil Matthew和Richard Stones)第三章: Working with files。系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思。面向的是硬件。而库函数调用则面向的是应用开发的,相当于应用程序的api,采用这样的方式有很多种原因,第一:双缓冲技术的实现。第二,可移植性。第三,底层调用本身的一些性能方面的缺陷。第四: 阅读全文
posted @ 2012-12-21 16:08
陳さん様
阅读(160)
评论(0)
推荐(0)
摘要:
一直对linux启动时挂载根文件系统的过程存在着很多疑问,今天在水木精华区找到了有用的资料,摘录如下:1。linux启动时,经过一系列初始化之后,需要mount 根文件系统,为最后运行init进程等做准备,mount 根文件系统有这么几种方式:1) 文件系统已经存在于硬盘(或者类似的设备)的某个分区上了,kernel根据启动的命令行参数(root=/dev/xxx),直接进行mount。这里 有一个问题,在root文件系统本身还不存在的情况下,kernel如何根据/dev/xxx来找到对应的设备呢?注意:根文件系统和其他文件系统的 mount方式是不一样的,kernel通过直接解析设备的名称来 阅读全文
posted @ 2012-12-21 16:07
陳さん様
阅读(273)
评论(0)
推荐(0)
摘要:
用内联取代宏:1.内联可调试;2.可进行类型安全检查或自动类型转换;3.可访问成员变量。另外,定义在类声明中的成员函数自动转化为内联函数。文章(一)内联函数与宏定义 在C中,常用预处理语句#define来代替一个函数定义。例如: #define MAX(a,b) ((a)>(b)?(a):(b)) 该语句使得程序中每个出现MAX(a,b)函数调用的地方都被宏定义中后面的表达式((a)>(b)?(a):(b))所替换。 宏定义语句的书写格式有过分的讲究, MAX与括号之间不能有空格,所有的参数都要 放在括号里。尽管如此,它还是有麻烦: int a=1,b=0; MAX(... 阅读全文
posted @ 2012-12-21 16:01
陳さん様
阅读(431)
评论(0)
推荐(0)
摘要:
stat函数讲解表头文件: #include <sys/stat.h> #include <unistd.h>定义函数: int stat(const char *file_name, struct stat *buf);函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中返回值: 执行成功则返回0,失败返回-1,错误代码存于errno错误代码: ENOENT 参数file_name指定的文件不存在 ENOTDIR 路径中的目录存在但却非真正的目录 ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接 EFAULT 参数bu 阅读全文
posted @ 2012-12-21 16:00
陳さん様
阅读(248)
评论(0)
推荐(0)
摘要:
暴雪公司有个经典的字符串的hash公式先提一个简单的问题,假如有一个庞大的字符串数组,然后给你一个单独的字符串,让你从这个数组中查找是否有这个字符串并找到它,你会怎么做?有一个方法最简单,老老实实从头查到尾,一个一个比较,直到找到为止,我想只要学过程序设计的人都能把这样一个程序作出来,但要是有程序员把这样的程序交给用户,我只能用无语来评价,或许它真的能工作,但...也只能如此了。最合适的算法自然是使用HashTable(哈希表),先介绍介绍其中的基本知识,所谓Hash,一般是一个整数,通过某种算法,可以把一个字符串"压缩" 成一个整数,这个数称为Hash,当然,无论如何,一 阅读全文
posted @ 2012-12-21 15:59
陳さん様
阅读(207)
评论(0)
推荐(0)
摘要:
二叉排序树的创建,查找与删除,以下代码是其所有左子树的结点均小于根的值,其右子树的值均小于其根的值。点击(此处)折叠或打开#include<stdio.h>#include<malloc.h>typedef int datatype;#define ENDKEY 0typedef struct BSTree{datatype data;struct BSTree *lchild;struct BSTree *rchild;}BSTreenode,*BSTree;typedef struct node{BSTree BST;struct node *next;}Queue 阅读全文
posted @ 2012-12-21 15:57
陳さん様
阅读(258)
评论(0)
推荐(0)
摘要:
首先对查找的列表有两个要求:(1)、必须采用顺序存储结构(2)、必须按关键大小有序排列算法思想:首先,将表中间位置记录的关键字与查找关键字比较,如果两者相等则查找成功,否则利用中间位置记录将表分成前后两个字表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复上述过程,知道找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。测试程序如下所示:点击(此处)折叠或打开#include<stdio.h>int Find(int a[],int x,int length){int low,high;int mid;low=1,hig 阅读全文
posted @ 2012-12-21 15:55
陳さん様
阅读(164)
评论(0)
推荐(0)
摘要:
算法思想:假设初始序列含有n个记录,首先将这n个记录看成n个有序的子序列,每个子序列的长度为1,然后两两合并,得到[n/2]个长度为2(n为奇数时,最后一个序列的长度为1)的有序子序列。在此基础上再对长度为2的有序子序列进行两两合并,得到若干个长度为4的有序子序列。如此重复,直到得到一个长度为n的有序子序列。测试代码如下所示:点击(此处)折叠或打开#include<stdio.h>void Merge(int a[],int low,int mid,int high,int a3[]){int i=low,j=mid+1,k=low;while((i<=mid)&&a 阅读全文
posted @ 2012-12-21 15:54
陳さん様
阅读(426)
评论(0)
推荐(0)
摘要:
思想:从待排序记录序列中选取一个记录(通常选取第一个记录)为枢轴其关键字设为k1,然后将其余关键字小于k1的记录移到前面去,而将关键字大于k1的记录移到后面,结果将待排序序列分成了两个子表最后将关键字为k1的记录查到其分界线的位置处.算法步骤:假设待划分序列为r[left],r[left+1],.......r[right],具体实现上述划分过程时,可以设两个指针i和j,他们的初值分别为left,right.首先将基准记录r[left]移至变量x中,是r[left],即r[i]相当于空单元,然后反复进行如下两个扫描过程,直到i和j相遇(1)j从右向左扫描,直到r[j].key<x.key 阅读全文
posted @ 2012-12-21 15:51
陳さん様
阅读(225)
评论(0)
推荐(0)
摘要:
算法思想:首先将与堆相应的完全二叉树根节点中的记录移出,该记录称为待调整记录,此时根节点相当于空节点,从空节点的左右孩子中选出一个关键字较大的记录,如果该记录的关键字大于待调整记录的关键字,则将该记录上移至空节点中。此时,原来的那个关键字较大的节点相当于空节点,从空节点的左右孩子中选出一个关键字较大的记录,如果该记录的关键字仍大于待调整记录的关键字,则将该记录上移至空节点。重复上述过程,直至空节点左右孩子的关键字均小于待调整记录的关键字,此时,将待调整记录放入空节点中,测试代码如下所示:点击(此处)折叠或打开#include<stdio.h>#include<stdlib.h 阅读全文
posted @ 2012-12-21 15:49
陳さん様
阅读(164)
评论(0)
推荐(0)

浙公网安备 33010602011771号