导航

随笔分类 -  C/C++

摘要:原型:char *strsep(char **stringp, const char *delim); 功能:分解字符串为一组字符串。从stringp指向的位置起向后扫描,遇到delim指向位置的字符后,将此字符替换为NULL,返回stringp指向的地址。 strsep函数,这在 Windows Dev-C++ 是没有支持的,在写 UNIX 分析字符串常常需要利用到此函式,大家可以 man strsep来看如何使用 strsep,假设我们要分析 URL Get 字符串:user_command=appleboy&test=1&test2=2,就可以利用两次 strsep 函式 阅读全文

posted @ 2012-02-21 20:20 网名还没想好 阅读(1564) 评论(0) 推荐(0) 编辑

摘要:一,流与缓冲 流I/O是由C语言的标准函数提供的,这些I/O可以替代系统中提供的read和write函数。事实上流I/O的内部封装了这两个基本的文件读写系统调用。使用流I/O在某些程度上来讲要方便一些,这些I/O在效率上没有特别大的差异。 基于流的操作最终会调用read或者write函数进行操作。为了使程序的运行效率最高,流对象通常会提供缓冲区,以减少调用系统I/O库函数的次数。 基于流的I/O提供以下2种缓冲:1,全缓冲:直到缓冲区填满,才调用系统I/O函数。对于读操作来说,直到读入的内容的字节数等于缓冲区大小或者文件以经到达结尾,才进行I/O操作将外存文件内容读入缓冲区;对于写操作来说,. 阅读全文

posted @ 2012-02-20 21:59 网名还没想好 阅读(1431) 评论(0) 推荐(0) 编辑

摘要:1,inode中保存哟普文件内容的块号码,Linux内核进行读写操作时,会根据inode中的盘块号码来操作相应的盘块,完成对文件的读写。mv命令用于移动一个文件,即使要移动的文件很大,其移动速度也很快,原因是mv命令没有移动文件内容而是改变了文件的目录项。该命令在新的目录下创建一个新的目录项,并将其指向原来的文件即可。2,Linux环境使用Link函数创建一个硬链接,其函数原型:int link(const char *path1,const char*path2),第一个参数是现有文件名,第二个参数是新的目录项。Linux文件系统不允许普通用户创建一个链接到目录的硬链接,因为这样可能会导致文 阅读全文

posted @ 2012-02-18 18:37 网名还没想好 阅读(329) 评论(0) 推荐(0) 编辑

摘要:real user ID:实际用户ID,指的是进程执行者是谁effective user ID:有效用户ID,指进程执行时对文件的访问权限saved set-user-ID:保存设置用户ID,作为effective user ID的副本,在执行exec调用时后能重新恢复原来的effectiv user ID.上面这三个ID是相对于进程而言的.set-user-ID:设置用户ID,这是相对于文件来说的.设置了set-user-ID位的可执行程序,执行时,进程的effective user ID与saved set-uesr-ID都为程序文件所属用户的ID,些时real user ID与effec 阅读全文

posted @ 2012-02-16 20:38 网名还没想好 阅读(1621) 评论(0) 推荐(1) 编辑

摘要:线程的栈是线程的私有数据,这部分内容是不共享的。在一个进程内有多个线程,这些线程都有自己的栈,但是又都要挤在进程的虚拟地址空间内。线程之间的栈内存必须保证彼此不冲突线程才能正确地运行。因此,虽然大多数情况下,由系统为用户设置和线程的栈内存,但有些时候还是需要用户亲自对线程进行设置。 线程基本属性中和线程栈有关的属性有三个,分别是线程栈的大小、线程栈的最低地址和线程栈末尾警戒区的大小。 系统默认为一个新建的线程提供PAGESIZE个字节的栈空间,但是很多时候需要更改此值。有时候该线程栈可能会不够用,例如,线程体函数是一个多层递归函数,该函数的特点就是需要多层嵌套栈来保存执行过程,因此,该函数可. 阅读全文

posted @ 2012-02-16 18:46 网名还没想好 阅读(1047) 评论(0) 推荐(0) 编辑

摘要:fopen()、fdopen()、close()2010年01月03日 星期日 12:58Linux环境下可以使用下列函数打开一个流,其函数原型如下: #include <stdio.h> FILE * fopen(const char * restrict pathname, const char * restrict type); FILE * fdopen(int filedes, const char *type); fopen函数的第1个参数表示需要打开文件的路径,第2个参数type表示打开的方式,该值以一个字符串的形式传入, type 字串中包含字母a的表示" 阅读全文

posted @ 2012-02-15 14:29 网名还没想好 阅读(4688) 评论(0) 推荐(1) 编辑

摘要:3.VFSLinux支持各种各样的文件系统格式,如ext2、ext3、reiserfs、FAT、NTFS、iso9660等等,不同的磁盘分区、光盘或其它存储设备都有不同的文件系统格式,然而这些文件系统都可以mount到某个目录下,使我们看到一个统一的目录树,各种文件系统上的目录和文件我们用ls命 令看起来是一样的,读写操作用起来也都是一样的,这是怎么做到的呢?Linux内核在各种不同的文件系统格式之上做了一个抽象层,使得文件、目录、读写访 问等概念成为抽象层的概念,因此各种文件系统看起来用起来都一样,这个抽象层称为虚拟文件系统(VFS,Virtual Filesystem)。上一节我们介绍了一 阅读全文

posted @ 2012-02-15 14:19 网名还没想好 阅读(1260) 评论(0) 推荐(0) 编辑

摘要:虚拟内存---linux操作系统采用虚拟内存管理技术,使得每个进程都有独立的进程地址空间,该空间是大小为3G,用户看到和接触的都是虚拟地址,无法看到实际的物理地址。利用这种虚拟地址不但能起到保护操作系统的作用,而且更重要的是用户程序可使用比实际物理内存更大的地址空间。linux将4G的虚拟地址空间划分为两个部分------用户空间和内核空间。用户空间从0----0xbfffffff,内核空间从3G----4G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间。例外情况是用户进程通过系统调用访问内核空间。进程空间----用户空间对应进程,所以每当进程切换,用户空间就会跟着变化。每个 阅读全文

posted @ 2012-02-13 20:10 网名还没想好 阅读(1910) 评论(0) 推荐(1) 编辑

摘要:用printf()输出时是先输出到缓冲区,然后再从缓冲区送到屏幕上。那什么情况下才会将缓冲区里的内容送到屏幕上呢?一,使用fflush(stdout)强制刷新。二,缓冲区已满。三,scanf()要在缓冲区里取数据时会先将缓冲区刷新。四,\n,\r进入缓冲区时。五,线程结束的时候,如果该线程里也有printf(....);六,程序结束时。#include<stdio.h>#include<stdlib.h>int main(){int i=89;int x;printf("--------------\n");//输出-----------后不会立即输 阅读全文

posted @ 2012-02-13 13:56 网名还没想好 阅读(2912) 评论(0) 推荐(0) 编辑

摘要:一般来说,Posix的线程终止有两种情况:正常终止和非正常终止。线程主动调用pthread_exit()或者从线程函数中return都将使线程正 常退出,这是可预见的退出方式;非正常终止是线程在其他线程的干预下,或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的。不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退出的前提下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特别是锁资源,就是一个必须考虑解决的问题。最经常出现的情形是资源独占锁的使用:线程为了访问临界资源而为其加上锁,但在访问过程中被外界取消,如果线程处于响应取消状态,且采用 阅读全文

posted @ 2012-02-11 14:47 网名还没想好 阅读(381) 评论(0) 推荐(0) 编辑

摘要:面向对象语言C++的基本特征是封装、继承、多态,其实这些用C语言同样可以实现。封装可以用结构体来实现,继承可以用包含来实现,这些都好说,下面我用代码重点说一下如何用C语言实现C++的多态。using namespace std;typedef struct Animal{void (*show) ();}CAnimal;void showpig(){cout<<__FUNCTION__<<endl;}void showbird(){cout<<__FUNCTION__<<endl;}void showdog(){cout<<__FUN 阅读全文

posted @ 2012-02-11 14:14 网名还没想好 阅读(891) 评论(0) 推荐(0) 编辑

摘要:指针在声明的时候可以用关键字restrict修饰,如 int *restrict p; 将告诉编译器,指针p是访问p所指对象的唯一方式 阅读全文

posted @ 2012-02-09 20:05 网名还没想好 阅读(163) 评论(0) 推荐(0) 编辑

摘要:C语言操作符优先级优先级运算符含 义要求运算对象的个数结合方向1()[]->.圆括号下标运算符指向结构体成员运算符结构体成员运算符自左至右2!逻辑非运算符1(单目运算符)自右至左~按位取反运算符++自增运算符--自减运算符-负号运算符(类型)类型转换运算符*指针运算符&地址与运算符sizeof长度运算符3*/%乘法运算符除法运算符求余运算符2(双目运算符)自左至右4+-加法运算符减法运算符2(双目运算符)自左至右5<<>>左移运算符右移运算符2(双目运算符)6<<=>>=关系运算符2(双目运算符)自左至右7==!=等于运算符不等于运 阅读全文

posted @ 2012-01-13 19:36 网名还没想好 阅读(577) 评论(0) 推荐(0) 编辑

摘要:int main(int argc,char * argv[])argv为指针的指针argc为整数char **argv or: char *argv[] or: char argv[][]main()括号内是固定的写法。下面给出一个例子来理解这两个参数的用法:假设程序的名称为prog,当只输入prog,则由操作系统传来的参数为:argc=1,表示只有一程序名称。argc只有一个元素,argv[0]指向输入的程序路径及名称:./prog当输入progpara_1,有一个参数,则由操作系统传来的参数为:argc=2,表示除了程序名外还有一个参数。argv[0]指向输入的程序路径及名称。argv[ 阅读全文

posted @ 2012-01-13 14:02 网名还没想好 阅读(548) 评论(0) 推荐(1) 编辑

摘要:1. 概述AVL树是最早提出的自平衡二叉树,在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis。AVL树种查找、插入和删除在平均和最坏情况下都是O(log n),增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。本文介绍了AVL树的设计思想和基本操作。2. 基本术语有四种种情况可能导致二叉查找树不平衡,分别为:(1)LL:插入一个新节点到根节点的左子树(Left)的左子树(Left),导致根节点的平衡因子由1变为2(2)RR:插入一个新节点到根节点的右子树(Right)的右子树 阅读全文

posted @ 2012-01-05 16:38 网名还没想好 阅读(349) 评论(1) 推荐(1) 编辑

摘要:本贴涉及的硬件平台是X86,如果是其它平台,嘻嘻,不保证能一一对号入座,但是举一反三,我想是完全可行的。 一、概念 物理地址(physical address) 用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应。 ——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理地址理解成插在机器上那根内存本身,把内存看成一个从0字节一直到 最大空量逐字节的编号的大数组,然后把这个数组叫做物理地址,但是事实上,这只是一个硬件提供给软件的抽像,内存的寻址方式并不是这样。所以,说它是“与 地址总线相对应”,是更贴切一些,不过抛开对物理内存寻址方式的考虑,直接把物理.. 阅读全文

posted @ 2011-12-30 21:58 网名还没想好 阅读(508) 评论(0) 推荐(0) 编辑

摘要:《UNXI网络编程》定义:术语“小端”和“大端”表示多字节值的哪一端(小端或大端)存储在该值的起始地址。小端存在起始地址,即是小端字节序;大端存在起始地址,即是大端字节序废话就不说了,直接代码#include<stdio.h>union key{int a;char s[2];}Q;int main(){Q.a=0x4142;printf("%c\n%c",Q.s[0],Q.s[1]);return 0;}执行结果:B A。X86体系是小端模式的,比如0X8975,则89存在大地址端,而75存在小地址端,与我们习惯相近。由于union共享内存,所以就输出了B A 阅读全文

posted @ 2011-12-28 23:04 网名还没想好 阅读(350) 评论(0) 推荐(0) 编辑

摘要:一,内存对齐1,分析需不需要对齐,只需要看到底会不会影响访问次数。2,内存对齐是一种典型的空间换时间的方法。3,对齐的原则是: 1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding); 3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。struct SByte1 { double d; // 偏移量0~7 char j; // 偏移量8 ... 阅读全文

posted @ 2011-12-24 15:30 网名还没想好 阅读(628) 评论(0) 推荐(0) 编辑

摘要:一,符号解析规则声明表示告知编译器该变量的存在,如:int a;而定义不仅告知编译器该变量的存在,还同时为该变量赋值,如:int a=9;在声明时不为该变量分配存储空间,定义时会为其分配内存空间。当该变量在其作用域内只有声明没有定义时,编译器会自动将第一个声明认为是该变量的定义,如:int f(int b){int a;//此时由于在该函数内找不到a的定义,因此该声明被认为是变量的定义,分配了四个字节的内存空间a=3;//此时不是定义,而是赋值。return a+b;}对结构体的赋值,比如typedef struct{int a;} SS;SS i={3};//正确,用{3}对结构体i进行初始 阅读全文

posted @ 2011-12-23 22:52 网名还没想好 阅读(398) 评论(0) 推荐(0) 编辑

摘要:回调函数的另一个典型的作用是实现类似C++的泛型算法。如qsort的实现等等。 下面是我利用回调函数的特性来写的一个泛型函数,该函数的功能是在任意一组对象中求出其最大值,该对象可以是char型,也可以是int型......不多说了,直接看程序吧:#include <stdio.h>typedef int (*cmp_t) (void*, void*);/* 回调函数1: 对比的是char类型对象 */int cmp_char_data(void* a, void* b){ char para1 = *((char*)a); char para2 = *((char*)b); if( 阅读全文

posted @ 2011-12-23 21:55 网名还没想好 阅读(449) 评论(0) 推荐(0) 编辑