- 博客(69)
- 收藏
- 关注
转载 构造函数为什么不能是虚函数
1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造
2017-05-13 22:10:16
615
转载 TCP协议的拥塞控制机制
最初的TCP协议只有基于窗口的流控制(flow control)机制而没有拥塞控制机制。流控制作为接受方管理发送方发送数据的方式,用来防止接受方可用的数据缓存空间的溢出。流控制是一种局部控制机制,其参与者仅仅是发送方和接收方,它只考虑了接收端的接收能力,而没有考虑到网络的传输能力;而拥塞控制则注重于整体,其考虑的是整个网络的传输能力,是一种全局控制机制。正因为流控制的这种局限性,从而导
2016-12-31 18:44:43
1711
原创 服务器和客户机的信息函数以及读写函数
1.服务器和客户机的信息函数(1) 字节转换函数 在网络上面有着许多类型的机器,这些机器在表示数据的字节顺序是不同的,比如i386芯片是低字节在内存地址的低端,高字节在高端,而alpha芯片却相反。为了统一起来,在Linux下面,有专门的字节转换函数。unsigned long int htonl(unsigned long int hostlong)unsigned sh
2016-12-30 18:26:08
636
原创 Linux网络编程--初等网络函数介绍(TCP)
Linux系统是通过提供套接字(socket)来进行网络编程的.网络程序通过socket和其它几个函数的调用,会返回一个 通讯的文件描述符,我们可以将这个描述符看成普通的文件的描述符来操作,这就是linux的设备无关性的好处。我们可以通过向描述符读写操作实现网络之间的数据交流。(1)socket 函数功能:建立一个socket通信。函数原型:int socket(int d
2016-12-29 18:55:27
628
原创 TCP/IP协议
TCP/IP的分层模型OSI协议参考模型,它是基于国际标准化组织(ISO)的建议发展起来的,它分为7个层次:应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。这个7层的协议模型虽然规定得非常细致和完善,但在实际中却得不到广泛的应用,其重要的原因之一就在于它过于复杂。但它仍是此后很多协议模型的基础。与此相区别的TCP/IP协议模型将OSI的7层协议模型简化为4层,从
2016-12-28 20:47:39
909
原创 线程之间的同步和互斥
1.互斥锁线程控制互斥锁是用一种简单的加锁方法来控制对共享资源的原子操作。 互斥锁只有两种状态,也就是上锁和解锁,可以把互斥锁看作某种意义上的全局变量。 在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进行操作。若其他线程希望上锁一个已经被上锁的互斥锁,则该线程就会挂起,直到上锁的线程释放掉互斥锁为止。互斥锁可以分为快速互斥锁、递归互斥锁和检错互斥锁。
2016-12-27 17:57:32
958
原创 链表通讯录
#include #include #include #include #define MAXSIZE 20/*定义结构体,保存通讯录中每个联系人的信息,person为节点类型,linkman为指向 person类型节点的指针类型*/typedef struct node{ char name[MAXSIZE]; char phone[M
2016-12-26 13:23:11
823
原创 有关线程
1.线程和进程的区别:说到线程就必须说到进程,我们知道进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元;是程序执行时的一个实例,即它是程序已经执行到课中程度的数据结构的汇集。而线程是进程的一个执行流,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程由几个线程组成(拥有很多相对独立的执行流的用户程序共享应用程序的大部分数据结构
2016-12-24 22:13:48
712
原创 终止进程工具及top监视系统任务工具
1.终止进程的工具终止一个进程或终止一个正在运行的程序,一般是通过kill,killall,pkill,xkill等进行的。例如一个程序已经死掉了,但又不能退出,这时应该考虑应用这些工具。(1)kill函数kill是和ps或pgrep命令结合在一起使用的,其用法为:kill 信号代码 进程ID信号代码可以省略,我们常用的信号代码是-9,表示强制终止。例如对
2016-12-23 18:20:07
1380
原创 ps监视进程工具和pgrep查询进程工具
1.ps监视进程工具ps的参数说明:l:长格式输出u:按用户名和启动时间的顺序来显示进程j:用任务格式来显示进程f:用树状格式来显示进程a:显示所有用户的所有进程(包括其他用户)x:显示无控制终端的进程r:显示运行中的进程ww:避免详细参数被截断我们常用的选项组合是aux或lax,另外还有参数f的应用。ps:aux或lax输出的解释USER:进程的属
2016-12-22 22:31:07
727
原创 信号量
1.信号量(又名:信号灯)与其他进程间通信方式不大相同,主要用途是保护临界资源。进程可以根据它判定是否能够访问某些共享资源。除了用于访问控制外,还可用于进程同步。信号量是用来解决进程之间的同步与互斥问题的一种进程之间通信机制,包括一个称为信号量的变量和在该信号量下等待资源的进程等待队列,以及对信号量进行的两个原子操作(PV操作)。其中信号量对应于某一种资源,取一个非负的整型值。信号
2016-12-21 21:25:19
555
原创 消息队列
1.消息队列:unix早期通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便。消息队列(也叫做报文队列)则克服了这些缺点。消息队列就是一个消息的链表.可以把消息看作一个记录,具有特定的格式.进程可以向中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。消息队列的实现包括创建或打开消息队列,添加消息,读取消息和控制消
2016-12-20 21:18:14
431
原创 共享内存
1.共享内存是被多个进程共享的一部分物理内存.共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻2.看到其中的内容。共享内存实现分为两个步骤:(1)创建共享、打开共享内存,使用shmget函数。(2)映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。 (3)分离共享内存。 (4
2016-12-19 21:29:17
353
原创 进程间的信号通信
1.信号通信:信号(signal)机制是Unix系统中最为古老的进程间通信机制,很多条件可以产生一个信号:(1)当用户按某些按键时,产生信号。 (2)硬件异常产生信号:除数为0,无效的存储访问等等。这些情况通常由硬件检测到,将其通知内核,然后内核产生适当的信号通知进程,例如,内核对正访问一个无效存储区的进程产生一个SIGSEGV信号。 (3)进程用kill函数将
2016-12-18 21:36:12
497
原创 c语言中不需要中间变量就能实现两个数交换的几种算法
第一类方法也是常用的方法,通过多次的数值计算来完成交换,到现在知道的有下面三种:(1)加减法。a = a + b;b = a - b;a = a - b;该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失,例如对数据:a = 3.123456b = 1234567.000000交换后各变量值变为:a = 1234567.000000
2016-12-17 22:07:08
7518
原创 memcpy函数实现
1.原型:void *memcpy(void *dest, const void *src,size_t size); 头文件:#include ; 功能:由src所指内存区域复制size个字节到dest所指内存区域。 说明:这里我们需要注意的是对于地址重叠的情况,标准库中的该函数的行为是未定义的。因此自己动手实现 memcpy()时就
2016-12-16 22:05:56
770
原创 strtok函数及其实现
头文件:#include 定义函数:char * strtok(char *s, const char *delim);函数说明:strtok()用来将字符串分割成一个个片段。参数s 指向欲分割的字符串,参数delim 则为分割字符串,当strtok()在参数s 的字符串中发现到参数delim 的分割字符时则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s
2016-12-15 21:56:39
13586
原创 管道通信
1.管道通信:管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。数据被一个进程读出后,将被从管道中删除,其它读进程将不能再读到这些数据。管道提供了简单的流控制机制,进程试图读空管道时,进程将阻塞。同样,管道已经满时,进程再试图向管道写入数据,进程将阻塞。管道包括无名管道
2016-12-14 22:18:54
690
原创 进程的执行退出函数
1.execl:(1)函数的作用:执行文件(2)函数的原型:int execl(const char *path,const char *argv,...);(3)函数的参数:path:字符串代表的文件路径 argv:执行文件传递的参数地址,最后一个以NULL结束。(4)函数的返回值:成功不返回,失败返回-1。(5
2016-12-13 22:15:26
1363
原创 进程创建函数fork与vfork
1.fork:(1)函数的功能 :创建一个进程(2)函数的原型:pid_t fork(void);(3)函数的返回值: =0 子进程 >0 父进程(其值为子进程的识别号)(4)头文件
2016-12-12 21:09:00
368
原创 有关的进程概念
1.进程的定义:进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元。2.进程与程序的区别:(1)进程是动态的,程序使静态的:程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移;而程序通常对应着文件,静态和可以复制。(2)进程是暂时的,程序使长久的:进程是一个状态变化的过程,程序可长久保存。(3)进程与程序组成不同:进程的组成包括
2016-12-11 21:22:01
375
原创 常量指针与指针常量
指针常量与常量指针是C语言中两个比较容易混淆的概念。如下面三个例子: (1)const char *p; (2)char * const p = a; (3)cahr * p = "abc";语句(1)定义了一个常量指针,即指向一个常量的指针,指向的内容是常量,不可修改,放在常量区的,但指针本身可以被修改,即“*p = 'b'”是非法的。*p 是p指向的常量的
2016-12-10 23:23:53
365
原创 链表中的一级指针和二级指针
在数据结构中,我们在使用链表的时候经常会碰到一级指针引用和二级指针引用,那么这两者有什么区别,什么时候使用一级指针,什么时候使用二级指针呢?我们先看下面的程序#include "stdio.h" #include "stdlib.h" #include "time.h" #define OK 1 #define ERROR 0 #de
2016-12-09 22:56:52
912
原创 文件程序练习
text1.txtbegin10 11 1220 21 2230 31 32endtext2.txtbegin15 16 1725 26 2735 36 37endtext3.txtbegin25 27 2945 47 4965 67 69end手动创建两个文本文件text1.txt,text2.txt,要求编程创
2016-12-08 22:41:01
374
原创 堆空间与栈空间的区别
1.栈区(stack):又编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。 2.堆区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。3.堆和栈的区别:(1)由以上综述就可以得知,他们程序的内存分配方式不同。(2)申请和响应不同:
2016-12-07 22:39:33
16205
2
原创 针对文件描述符和合针对流的两种函数对文件的复制
1.针对文件描述符的函数文件复制:#include #include #include #include #include #include /*使用几个文件操作函数所需要的头文件*/#define MAXSIZE 1024int main(int argc,char *argv[]){ int from_fd; int to_f
2016-12-06 22:42:28
342
原创 文件编程
1.系统调用:所谓系统调用是指操作系统提供给用户的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的的服务。为了更好地保护内核空间,将程序的运行空间分为内核空间和用户空间(也就是常称的内核态和用户态),它们分别运行在不同的级别上,在逻辑上是相互隔离的。因此,用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调
2016-12-05 18:33:27
444
原创 有缓冲文件操作的几个函数
1.fopen:函数的功能:打开文件(基于标准I/O文件)函数的原型:FILE * fopen(const char *path,const char *mode)函数的参数:path:打开的文件路径或文件名 mode:表示流行态(1)r:打开只读文件,该文件必须存在(2)r+:打开读写文件,该文件必须存在(3)w:打开只写文件,
2016-12-04 22:28:34
721
原创 有关文件操作的几个函数
1.creat:(1)函数的作用:建立,创建新文件。(2)函数的原型:int creat (const char * pathname,mode_t mode)(3)函数的参数:pathname:要建立的文件路径字符串。如:“/home/hello.c”。 mode:建立文件的权限。(4)函数的返回值:成功返回
2016-12-03 19:49:08
446
原创 数组与链表的优缺点和区别
1.数组:数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少插入和删除元素,就应该用数组。2.链表:链表中的元素在内存中不是顺
2016-12-02 22:32:04
25942
4
原创 枚举与define的区别和volatile关键字的作用
1.枚举与define的区别:(1)从处理过程的角度看:#define宏是由编译预处理器在预编译处理时处理的,而且只做简单的字符串的替换。枚举常量则是在编译的时候确定其值的。(2)从调试的角度看:通常情况下,在编译器里,可以调试枚举常量,而不能调试宏常量。(3)从数据的类型看:#define可以编译任意类型的常量,而枚举只能是定义整型常量。(4)从代码编写角度看:枚
2016-12-01 22:11:47
1028
原创 内敛函数inline
函数的引入可以减少程序的目标代码,实现程序代码的共享。函数调用需要时间和空间开销,调用函数实际上将程序执行流程转移到被调函数中,被调函数的代码执行完后,再返回到调用的地方。这种调用操作要求调用前保护好现场并记忆执行的地址,返回后恢复现场,并按原来保存的地址继续执行。对于较长的函数这种开销可以忽略不计,但对于一些函数体代码很短,又被频繁调用的函数,就不能忽视这种开销。这个时候就需
2016-11-30 16:55:45
850
1
原创 typedef与#define的区别
1.typedef是一种在计算机编程语言中用来声明自定义数据类型,配合各种原有数据类型来达到简化编程的目的的类型定义关键字。2. #define是预处理指令。在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如: typedef int INTEGER; 这以后就可用INTEGER来代替int作
2016-11-29 17:23:07
580
原创 链式栈和链式队
1.链式栈:栈的链式存储结构, 简称链栈。/*链栈的结构代码*/ typedef struct stackNode{SElemType data;struct stackNode *next;} stackNode ,*LinkStackPtr;typedef struct LinkStack{LinkStackPtr top;int count;
2016-11-28 22:03:20
761
原创 顺序栈和顺序队列
1.栈的定义:栈是限定在表尾进行插入和删除操作的线性表;把允许插入和删除的一端称为栈顶(top), 另一端称为栈底(bottom), 不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表。栈的插入操作,叫做进栈,也称为压栈,入栈。子弹入弹夹;栈的删除操作,叫做出栈,也有的叫做弹栈。(1)顺序栈的进栈操作:/*插入元素e为新的栈顶元素*/ Status Pu
2016-11-27 21:19:34
1327
原创 顺序表和链式表
1.数据元素之间不是独立的,存在特定的关系,这些关系即结构。所以数据结构是指数据对象中数据元素之间的关系。数据结构分为逻辑结构和物理结构。逻辑结构分为:集合结构:数据元素之间没有特别的关系,仅同属相同集合。线性结构:数据元素之间是一对一的关系。树形结构:数据元素之间存在一对多的层次关系。图形结构:数据元素之间是多对多的关系。物理结构分为:顺序存储结构:将数据存储在地
2016-11-26 23:11:40
4203
原创 单链表的创建,插入,删除以及逆序
#include /*结点定义,下面定义lnode是结点的类型,linklist是指向lnode类型结点的指针类型。*/typedef int datatype;typedef struct node{datatype data;struct node *next;}lnode,*linklist; /*建立一个空的单链表。*/ linklist creat_l
2016-11-25 20:06:38
587
原创 c语言笔面试题错题解析5
1.signed char a = 0xe0; unsigned int b= a; unsigned char c= a;下面说法正确的是?A (a>0)&&(b>0)为真B c== a 为真C b 的16进制为0xffffffe0D 都不对有符号数最高位为1,所以a为负数;负数原码转补码是符号位不变,其他各位取反,然后加1; 无符号数的
2016-11-24 17:48:32
1593
原创 编译预处理
我们知道在编译过程中的预处理阶段会进行头文件展开,宏替换以及条件编译。1.头文件展开:首先是头文件展开,头文件的前面都有#符号,其实是理指令。理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。下面是部分预处理指令:
2016-11-23 22:34:56
605
原创 可变参函数
C语言编程中有时会遇到一些参数个数可变的函数,例如,printf( )函数的函数原型为int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式。printf("%d",i); printf("%s",s); printf("th
2016-11-22 20:45:26
356
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人