- 博客(68)
- 收藏
- 关注
原创 IO多路复用之epoll函数详解
epoll 在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。 相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。 相对于select和poll来说,epoll更加灵活,没有描述符
2016-08-17 01:34:07 7606 1
原创 Linux下的进程1——进程概念,进程切换,上下文切换,虚拟地址空间
进程概述 当一个可执行程序在现代系统上运行时,操作系统会提供一种假象——好像系统上只有这个程序在运行,看上去只有这个程序在使用处理器,主存和IO设备。 处理器看上去就像在不间断的一条接一条的执行程序中的指令,即改程序的代码和数据是系统存储器中唯一的对象。这些假象是通过进程的概念来实现的。 进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在
2016-08-14 20:01:24 17425 5
原创 C++泛型编程2——类模板,容器适配器,仿函数
模板编译 当编译器遇到一个模板定义时,它并不生成代码。只有当我们实例化出模板的一个特定版本时,编译器才会生成代码。当我们使用模板时,比编译器才生成代码。 这一特性影响了我们如何组织代码以及错误何时被检测到。 通常,当我们调用一个函数时,编译器只需要掌握函数的声明。 类似的,当我们使用一个类类型的对象时,类定义必须是可用的,但成员函数的定义不必已经出现。 因此我们将类定义和函数声
2016-08-13 22:46:06 2101
原创 C++泛型编程1——函数模板实例化,模板参数,重载及特化
在C++中我们都知道引入了函数重载,那么在实际应用过程中: 如果我们想要实现一个加法函数,我们可以写出很简单的代码: int ADD(int a,int b){ return a+b;} 上面的函数很简单,但是仔细想一下,这样就实现了加法操作嘛?当我们的实参类型为double,float时,又怎么处理加法呢? 我们可以多定义几个函数 double ADD(doubl
2016-08-13 02:09:37 6394
原创 【TCP/IP】TIME_WAIT状态及地址reuse问题,SO_REUSEADDR参数详解
TCP/IP四次挥手 在TCP/IP协议取消连接的时候会进行四次挥手过程: 当某个应用进程主动关闭的时候,该端TCP会发送一个FIN分节,表示数据发送完毕。 接收到这个FIN的对端执行被动关闭,这个FIN由TCP进行确认,他的接受也作为一个文件结束符EOF传递给接收端应用进程,因为FIN的接受意味着接收端应用进程在相应连接上再无额外数据可以接受。 一段时间后,接受
2016-08-07 01:26:45 5061 1
原创 【UNIX网络编程】五种I/O模型,阻塞非阻塞同步异步问题详解
IO复用 在写简单的TCP/IP服务器-客户端程序时,客户端要同时处理两个输入: 标准输入TCP套接字 在结束的时候,因为客户端正阻塞于标准输入上的read函数,服务器TCP虽然正确的给客户TCP发送了一个FIN,但是既然客户进程正在阻塞于从标准输入读入的过程,他将看不到这个EOF,直到从套接字读时为止。 这样的进程需要一种预先告之内核的能力,使得内核一旦发现进程指定的一个或多个I/
2016-08-06 23:53:30 2409
原创 【Linux】终端,进程组,作业,会话及作业控制
终端概念 在UNIX系统中,用用户通过终端登录系统后得到一一个Shell进程,这个终端成为Shell进程的控制终端 (Controlling Terminal),控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。 默认情况 下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制
2016-08-03 02:00:55 5753
原创 C++多态篇3——虚函数表详解之多继承、虚函数表的打印
在上上一篇C++多态篇1一静态联编,动态联编、虚函数与虚函数表vtable中,我最后简单了剖析了一下虚函数表以及vptr。 而在上一篇文章C++多态篇2——虚函数表详解之从内存布局看函数重载,函数覆盖,函数隐藏中我详细介绍了虚函数的函数重载,函数覆盖以及函数隐藏的问题,其实在那一篇文章中,对单继承的虚函数已经做了十分详细的解答了,如果对前面有兴趣的人可以先看一下那篇文章。 在这一篇中,我
2016-04-15 15:49:05 8449 4
原创 C++多态篇2——虚函数表详解之从内存布局看函数重载,函数覆盖,函数隐藏
上一篇C++多态篇1一静态联编,动态联编、虚函数与虚函数表vtable中,我在最后分析了虚函数与虚函数表的内存布局,在下一篇详细剖析虚函数及虚函数表的过程中,我发现有关函数重载,函数覆盖,函数重写和函数协变的知识也要理解清楚才能对虚函数表在内存中的布局,对派生类的对象模型以及对多态的实现有更深的理解。 所以这一篇我作为一篇过渡篇,也同时对我以前写过的一篇博文进行一个收尾。在C++继承详解
2016-04-15 01:23:17 7495 2
原创 C++多态篇1一静态联编,动态联编、虚函数与虚函数表vtable
前面我写了几篇关于继承的博文,分别为: c++继承详解之一——继承的三种方式、派生类的对象模型 C++继承详解之二——派生类成员函数详解(函数隐藏、构造函数与兼容覆盖规则) C++继承详解之三——菱形继承+虚继承内存对象模型详解vbptr(1) C++继承详解之四——is-a接口继承和has-a实现继承 这几篇博文只涉及到了继承的知识,没有加入虚函数没有涉及到多态的知识,从这篇开始我会更
2016-04-13 15:13:24 8113 5
原创 Linux下Mysql常用命令总结
很久没有写博客啦,大概有一年了,还记得以前找工作前疯狂的总结,后期慢慢的有些懈怠,最近总结了一下自己的问题,觉得博客这个方式是一个很好的学习方式,还是不能丢掉,所以今天又开始写博客啦,如果是师妹师弟看到我的这篇文章,也希望对你们有些帮助。 写这篇文章的初衷是我发现在工作中,总是与mysql打交道,并且即使是同一条命令,随便加个选项其实会变得更加实用方便,本篇文章我会采用持续更新的方式去写,所
2017-07-19 18:52:03 7908
原创 socket编程选项——setsockopt和getsockopt
头文件:#include <sys/types.h> #include <sys/socket.h> setsockopt函数原型: int setsockopt(int sockfd, int level, int optname, const void* optival, socklen_t optlen); 功能: 用于任意类型、任意状态套接口的设置选项值. 参数: sockf
2016-09-17 15:33:34 4271
原创 服务器编程——gethostbyname函数
使用这个函数,首先要包含2个头文件:#include <netdb.h>#include <sys/socket.h>struct hostent *gethostbyname(const char *name); 这个函数的传入值是域名或者主机名,例如”www.google.com”,”wpc”等等。 传出值,是一个hostent的结构(如下)。 如果函数调用失败,将返回NULL。
2016-09-17 15:09:10 1980
原创 boost库智能指针,循环引用,定置删除器详解
智能指针用于指向存放在堆,即动态分配对象指针的类,用于对指针所指向的对象生存期的控制,防止内存泄露。 boost库中的智能指针定义在namespace boost中,包括: shared_ptr weak_ptr scoped_ptr shared_arr scoped_arrauto_ptr auto_ ptr是在std库中的,不在boost库中,但是auto
2016-09-16 00:16:35 1673
原创 计算机网络
HTTPGet和Post答:get和post都是http协议中与服务器交互的方法。 url地址用于描述一个网络上的资源,而get,post,put,delete等方法就对应着这个资源的查,改,增,删四个操作。 Get方法一般用于获取/查询资源信息。 Post一般用于更新资源信息。 二者区别为: 1.Get提交的数据会放在URL后,以问号?分隔URL和传输数据,参数以&相
2016-08-31 01:17:01 652
原创 C/C++
C与C++的区别答:C是结构化语言,重点在于算法和数据结构。 C++是面向对象的语言。首先要考虑的是如何构造一个对象模型,让这个模型能够配合对应的问题。 最大的区别在于,解决问题的思想方法不一样。const与define答:define只是用来做文本替换,他的生命周期止于编译器,存在于程序的代码段,在实际程序中只是一个常数,一个命令的参数,没有实际的存在。 const常量存在于程序
2016-08-31 00:34:50 725
原创 select,poll,epoll优缺点及比较
在之前我已经分析了这三个函数,请看我之前的文章: IO多路复用之select函数详解 IO多路复用之poll函数详解 IO多路复用之epoll函数详解 这篇文章只总结优缺点,以便面试时回答。select优点1)select()的可移植性更好,在某些Unix系统上不支持poll() 2)select() 对于超时值提供了更好的精度:微秒,而poll是毫秒。select缺点1) 单个进程
2016-08-17 01:51:11 15350 8
原创 IO多路复用之poll函数详解
poll poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。 poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。poll函数 函数格式如下所示:
2016-08-17 01:05:01 7002
原创 IO多路复用之select函数详解
IO复用 我们首先来看看服务器编程的模型,客户端发来的请求服务端会产生一个进程来对其进行服务,每当来一个客户请求就产生一个进程来服务,然而进程不可能无限制的产生,因此为了解决大量客户端访问的问题,引入了IO复用技术。 即:一个进程可以同时对多个客户请求进行服务。 也就是说IO复用的“介质”是进程(准确的说复用的是select和poll,因为进程也是靠调用select和poll来实
2016-08-17 00:48:14 10880 1
原创 Linux下的进程3——进程创建,文件替换,进程程序替换
进程标识 每个进程都有一个非负整型标识唯一的进程ID。因为进程ID标识符总是唯一的,常将其用作其他标识符的一部分以保证其唯一性。 虽然是唯一的,但是进程ID是可复用的,当一个进程终止后,其进程ID就称为复用的候选者,大多数UNIX系统实现延迟复用算法,使得赋予新建进程的ID不同于最近终止进程所使用的ID,这防止了将新进程误认为是使用同一ID的某一个已终止的进程。 系统中有一些专用进程。
2016-08-16 01:12:07 1948
原创 Linux下的进程2——进程的内存映像,进程PCB,task_struct详解
进程的内存映像 Linux下C程序生成主要由四个步骤组成: 预编译编译汇编链接 编译器gcc经过预编译,编译,汇编三个步骤将源程序文件转换成目标文件。 如果程序有多个目标文件或程序中使用了库函数,则编译器还需要将所有目标文件及所需的库文件链接起来,最后生成可执行程序。 当程序执行时,操作系统可将可执行程序复制到内存中. 程序转为进程通常需要以下步骤:内核将程序读入内存
2016-08-15 16:57:59 2897
原创 数据结构
ps:这部分请一定关注时间复杂度的计算和算法的优化,因为在面试中都会要求计算时间复杂度和不断优化你写的算法1.线性表1. 顺序表和链表的优缺点,它们分别在什么场景下使用? 2. 求一个单链表中节点个数 3. 删除一个无头单链表的非尾节点 4. 在无头单链表的一个节点前插入一个节点 5. 单链表实现约瑟夫环 6. 逆置单链表 7. 单链表排序 8
2016-08-13 19:53:52 599
原创 C++基础
基本语法1. 什么时候使用引用作为函数参数?2. 什么时候使用引用做函数返回值?3. 使用引用做函数返回值要注意些什么问题?4. 什么时候使用常引用?5. 引用和指针的区别和联系?6. const定义常量和#define 定义宏的优缺点?7. C++中使用哪些技术可以替代宏?为什么建议使用使用这些技术去替代宏?8. malloc/free和new/delete的区别和联系?9. 在
2016-08-13 19:50:42 632
原创 【面试】C++继承问题集锦
继承的概念答:继承是面向对象的三大特性之一,继承是指一个对象直接使用另一对象的属性和方法。 继承可以使子类具有父类的各种属性和方法。 继承的主要目的是实现代码的重用。派生类与基类的转换答:派生类总是可以转换为基类的引用类型。基类转换为派生类要在确认安全的条件下,使用强制转换来进行。有哪几种继承方式答: 继承的方式分为公有继承public,保护继承protected和私有继承priv
2016-08-12 00:33:30 2221
原创 【面试】C++多态问题集锦
1.什么是多态答:多态是面向对象的重要特性之一,它是一种行为的封装,是同一种事物所表现出的多种形态,简单地说是”一个接口多种实现“2.多态的作用答:多态技术允许将父类设置成和他的一个或更多的子对象相等。3.多态的分类答:有两种类型的多态性:编译时的多态性。编译时的多态性是通过重载来实现的。运行时的多态性。运行时的多态性是通过虚成员实现的。4.在C++中如何实现多态答:多态有动态多态,静态多态,
2016-08-11 23:55:25 3884
原创 【项目】MFC下TCP/IP的套接字编程中CSocket,CSocketfile与CArchive类
CSocket类与CAsyncSocket类CAsyncSocket类编程模型 在一个MFC应用程序中,要想轻松处理多个网 络协议,而又不牺牲灵活性时,可以考虑使用CAsyncSocket类,它的效率比CSocket 类要高。CSocket类编程模型 使用CSocket对象涉及CArchive和CSocketFile 类对象。 以下介绍的针对字节流型套接字的操作步骤中,只有第3步对于客户方和服
2016-08-11 21:04:18 4293
原创 【项目】基于TCP/IP的socket编程之心跳机制
什么是心跳机制? 想一下, 当tcp连接被破坏后, 如果是死连接了, 服务端和客户端怎样才能知道信息能不能到达对方呢? 很自然的想法是, 不断地给对方发探测信号, 看有没有回应, 这就是心跳机制的直白原理。 所谓的心跳即是数据包, 发心跳就是一方向另一方发送的数据包, 不断地发送, 如果收不到回应, 那么就有理由认为是tcp连接出了问题。 那为什么要叫心跳呢? 你摸一下你的心, 你看
2016-08-11 20:48:28 9922
原创 【面试】GDB调试
用GDB调试多进程程序 如果一个进程通过fork系统调用创建了子进程,gdb会继续调试原来的进程,子进程则正常运行。那么该如何调试子进程呢?单独调试子进程 子进程从本质上说也是一个进程,因此我们可以用通用的gdb调试方法来调试他。 举例来说如果要调试一个服务器中的某一个子进程,我们可以先运行服务器,然后找到目标子进程的PID,再将其附加(attach)到gdb调试器上,具体操作为:
2016-08-11 00:32:14 3527
原创 【Linux】stat命令查看文件的三个时间
stat命令 stat命令用于显示文件的状态信息。语法stat(选项)(参数) 选项 -L:支持符号连接; -f:显示文件系统状态而非文件状态; -t:以简洁方式输出信息; –help:显示指令的帮助信息; –version:显示指令的版本信息。 参数 文件:指定要显示信息的普通文件或者文件系统对应的设备文件名。Linu
2016-08-10 23:05:12 5143
原创 C语言与C++中static,extern的用法及区别总结
在C语言中:隐藏 很多人经常会忘了这一条。其实这个作用很常用也很重要。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。 为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 char a = 'A'; // global variablevoid msg() { printf("Hello\n
2016-08-10 22:31:21 4539
原创 【Linux】硬链接、软链接及inode详解
inode 文件储存在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。 文件数据都储存在
2016-08-10 21:49:31 6675 1
转载 【工具】GDB调试精粹
关于多进程调试技巧: 使用 GDB 调试多进程程序–1 使用 GDB 调试多进程程序–2 使用 GDB 调试多进程程序–3 gdb调试多进程和多线程命令 GDB调试基础 GDB调试汇总 【Linux学习】GDB调试器基本命令必知必会(一)一:列文件清单1. List(gdb) list line1,line2 二:执行程序要想运行准备调试的程序,可使用run命令,在它后面可以跟随发
2016-08-08 22:56:31 660
转载 【工具】gdb多线程/多进程(守护进程)调试
一 调试多进程1) follow-fork-mode :set follow-fork-mode [parent|child]parent: fork之后继续调试父进程,子进程不受影响。 child: fork之后调试子进程,父进程不受影响。在使用如下方法设置完要调试的程序后:gdb命令行的 –-args 参数 gdb环境中 set args命令。 gdb –pid=PID(ps -ef |
2016-08-08 22:53:52 2557
转载 【工具】GDB常见调试命令
1 、基本命令1.1 启动和退出GDB[root@localhost ~]#gdb test 启动GDB调试test程序[root@localhost ~]#gdb programe 2146 启动GDB调试进程号为2146的进程[root@localhost ~]# gdb (gdb) attach 2146 启动GDB挂载到进程号为2146的进程上开始调试(gdb)detach 2
2016-08-08 22:36:43 2112
转载 【工具】GDB使用方法总结(已重新排版)
GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能。 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能。而Windows下的图
2016-08-08 22:31:53 3154 2
原创 【排序】快速排序及其非递归实现,归并排序详解
快速排序 快速排序(Quicksort)是对冒泡排序的一种改进。 我们知道快速排序用的是分治的基本思想:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归的解决这些子问题,然后将这些子问题的解组合为原问题的解。 快速排序的基本思想是: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行
2016-08-08 19:32:09 1873
原创 【TCP/IP】TCP的三次握手,四次挥手过程详解
TCP传输控制协议 TCP是一个面向连接的协议,为用户进程提供可靠的全双工字节流。TCP套接字是一种流套接字,TCP关心确认、超时和重传之类的细节。 首先,TCP提供客户与服务器之间的连接。TCP客户先与某个给定服务器建立一个连接,再跨该连接与那个服务器交换数据,然后终止这个连接。可靠性 其实TCP还提供了可靠性。当TCP向另一端发送数据时,他要求对端返回一个确认,如果没有收到确认,TCP就自
2016-08-07 17:31:42 2510
原创 【TCP/IP协议】计算机网络中端口号及分类
端口号 任何时候,多个进程都可能同时使用TCP,UDP和SCTP这三种传输层协议中的任何一种,这三种协议都是用16位整数的端口号来区分这些进程。 简单来说: IP地址是标识在网络内的唯一一台主机端口号是标识在主机内中唯一的一个进程 所以IP地址加端口号就可以标识一个网络中的唯一一个进程,这就是网络通信的原理,在socket编程中,IP地址加端口号就是套接字。 这方面的知识在
2016-08-05 16:37:37 3524
原创 【排序】插入排序,希尔排序,选择排序,冒泡排序,堆排序详解及稳定性分析
插入排序直接插入排序 直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。 在这里要注意直接插入排序的前提,是插入到一个已经排好序的有序序列中,这表明,我们在插入一个数之前,必须保证被插入的序列是有序序列。 所以我们在插入之前,要先构造一个有序序列, 所以从第一个参数开始,我
2016-08-05 13:00:23 2660 1
原创 【Linux】守护进程及守护进程的创建
守护进程 守护进程是生存期长的一种进程。它们常常在系统引导装入时启动,仅在系统关闭时才终止。 守护进程没有控制终端。因此,说他们是在后台运行的。UNIX系统有很多守护进程,他们执行日常事务活动。 下面我从守护进程结构,以及如何编写守护进程程序两个方面分析守护进程。守护进程的特征 我们使用ps -axj命令查看一些常用的系统守护进程。
2016-08-03 12:26:40 3460 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人