- 博客(59)
- 收藏
- 关注
原创 死锁产生的原因
死锁产生的原因: 1. 系统资源不足; 2. 进程运行推进顺序不当; 3. 资源分配不均;死锁产生的四个必要条件: 1. 互斥条件; 2. 请求与保持; 3. 不剥夺; 4. 循环等待;银行家算法和鸵鸟算法是破坏了第4个条件(循环等待),因为银行家算法有了资源列表,资源进
2017-09-16 10:51:44
502
原创 数组指针和指针数组
首先,来看一下这两种形式: 1. int *p[10]; 2. int (*p)[10];这两个表达式到底代表什么呢?1. int *p[10]; 首先,式子中有[]和*运算符,那么就要考虑到底是* 的优先级高还是 []的优先级高呢?答案是,*和[]的优先级是一样的,那么就要按照靠右原则。即p是一个拥有10个int*元素的数组。2.
2017-09-16 10:30:06
443
原创 C++三大特性
1.C++的三大特性为:继承,多态,封装 (1)继承。一个对象直接使用另一个对象的属性和方法。优点:1.减少重复的代码。 2.继承是多态的前提。 3.继承增加了类的耦合性。缺点:1.继承在编译时刻就定义了,无法在运行时刻改变父类继承的实现; 2.父类通常至少定义了子类的部分行为,父类的改变都可能影响子类的行为; 3.如果继承下来的子类不适合解决新问题,父
2017-08-31 11:44:34
19582
4
原创 如何连续读取多个以空格分开的数字?遇见回车结束?
首先,能用的函数有很多,比如cin.get(), cin.getline(), gets(),getchar(), getline(),但是,经过检验发现都不方便。原因很明显,他们要求的参数不是字符串就是char*,用起来很麻烦。以下是我自己探索到的方法:1.数组法。 int arr[20]; int idx = 0; while(1) { cin >>arr[idx++];
2017-08-27 02:40:33
3304
原创 URL中的特殊字符
URL中的特殊字符 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值。例如 空格的编码值是"%20"。 下表中列出了一些URL特殊符号及编码 :替换为%3A 十六进制值 1. + URL 中+号表示空格 %2B
2017-08-14 16:21:09
904
原创 快速排序。冒泡排序递归和非递归的实现
快速排序:#pragma once#include #include using namespace std;void QuickSort_Rec(int arr[], int left, int right){ if(left >= right) { return; } int end = right; int start = left; int key = arr[
2017-08-01 16:43:24
3040
转载 三大web服务器比较
1. lighttpdLighttpd是一个具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。lighttpd是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能。Lighttpd使用fastcgi方式运行php,它会使用
2017-07-25 21:28:26
5886
原创 【面试题】复杂链表的复制
一个链表的每个节点,有一个指向next指针指向下一个节点,还有一个random指针指向这个链表中的一个随机节点或者NULL,现在要求实现复制这个链表,返回复制后的新链表。对于这个题,基本会有三个思路:1.这里链表的复制和单链表最大的不同,就是多了一个自由指针(psub),那么最简单的想法就是,遍历单链表,找到psub指向的节点,然后复制,这样做最简单,事件复杂度为O(n的平方);
2017-07-18 11:49:51
331
原创 判断两个链表是否相交并求交点
链表是否相交分为以下三种情况:1.两个单链表都不带环2.只有一个单链表带环3.两个单链表都带环#pragma once#include #include struct ListNode{ int value; ListNode* next;};class CreateList{ typedef
2017-07-16 17:23:25
354
原创 求单链表是否带环,环的长度,环入口点
1.分析单链表是否带环2.带环链表环的长度分析3.求环入口点分析具体代码如下:1.hpp文件#pragma once#include typedef struct ListNode{ int value; ListNode* next;}node,*pnode;pnode createNode(int data){ pn
2017-07-15 15:29:18
372
原创 查找单链表倒数第K个节点和以及逆置单链表
#pragma once#include using namespace std;struct ListNode{ int value; ListNode* next;};class List{ typedef ListNode node;public: List() :root(NULL) {} ~List() { no
2017-07-14 14:44:53
437
原创 合并两个有序的单链表
合并两个有序的单链表:1.创建两个有序的单链表;2.创建第三个链表来存放合并后的有序链表;#include using namespace std;struct ListNode{ int value; ListNode* next;};class CreateList{ typedef ListNode Node;public:
2017-07-13 08:52:44
517
原创 shell下字符串的截取----cut
cut是以行为单位,对一段数据进行截取。cut的语法格式为: cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file]cut 从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出,如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一.touc
2017-07-12 15:11:27
584
原创 linux下的crond和crontab用法
第一部分:对crond和crontab的认识crond linux中一个命令可以定期来执行系统任务。定时执行工具,可以在无需人工干预的情况下定时的执行任务。命令有:如果想让cron在开机的时候自动启动,在 /etc/rc.d/rc.local 脚本中加入 /sbin/service crond start 即可。crontabcrontab位于/usr/bi
2017-07-11 17:05:42
1269
原创 HTTP----超文本传输协议
HTTP协议定义了浏览器怎么样向万维网服务器请求万维网文档,以及服务器怎样把文档传输给浏览器。从层次的角度来看,HTTP是面向事务的应用层协议,它是万维网上能够可靠地交换文件的重要基础。HTTP是基于TCP的协议。DNS是基于UDP的协议。用户浏览页面有两种方式: 1. 直接输入页面的URL;2. 点击一个页面的可选部分,浏览器会自动的在因特网上找到所要链接的页
2017-07-10 11:32:49
963
原创 c++中三种传值方式
传值传参这种方法相当于将原来的变量拷贝了一份,然后传递过去。#include using namespace std;//传值传参int Fun1(int a){ a = a + 1; return a;}int main(){ int a = 1; cout<<Fun1(a)<<endl; cout<<a<<endl; return 0; }
2017-07-08 00:00:23
9181
原创 不创建临时变量,交换两个变量的值
1. 加减法给出两个变量a =10,b=20;让a = a+b,那么a=30;让b = a - b,那么b=10;让a = a - b,那么a=20;如此,没有创建临时变量就交换了a和b的值。 int i = 10; int j = 20; printf("i=%d j=%d\n", i, j); i = i + j; j = i - j;
2017-07-02 18:55:55
635
原创 Liunx彩色进度条
linux下怎么实现一些颜色或者特殊效果呢?如下:接下来,我用了彩色的进度条来说明问题:#!/bin/bashi=0bar=''myarr=( '-' '\\' '|' '/' )while [ $i -le 100 ]do printf "[\033[36m\033[1m%-100s\033[m]\033[31m[%d%%]\033
2017-06-28 23:31:12
272
原创 eval的作用
1. eval command-line其中command-line是在终端上键入的一条普通命令行。然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次。如:pipe="|"eval ls $pipe wc -lshell第1次扫描命令行时,它替换出pipe的值|,接着eval使它再次扫描命令行,这时shell把|作为管道符号了。如果变量中包含任何需要sh
2017-06-21 17:12:23
1325
原创 epoll服务器
#include #include #include #include #include #include #include static void Usage(const char *proc){ printf("Usage:%s[local_ip][local_port]\n", proc);}typedef struct fd_buf{
2017-06-21 17:08:53
292
原创 poll服务器
#include #include #include #include #include #include #include #include #define array_size 1024int startup(const char* _ip, int _port){ int sock = socket(AF_INET, SOCK_STREAM,
2017-06-21 17:07:41
184
原创 select服务器
多进程和多线程服务器有什么缺点呢?多进程服务器缺点: 1.内存消耗比较大,每个进程都独立加载完整的应用环境 2.cpu消耗偏高,高并发下,进程之间频繁进行上下文切换,需要大量的内存换页操作 3.很低的io并发处理能力,只适合处理短请求,不适合处理长请求多线程服务器缺点: 1.不方便操作系统的管理
2017-06-08 11:30:45
582
原创 运用dup2的tcp socket通信
dup 和 dup2既然有重定向的功能,那么我们之前写的tcp socket通信是不是可以修改一下呢?比如,不用write往socket里面写,而直接用dup2/dup重定向呢?答案是肯定的。代码如下tcp_dup2_server#include #include #include #include #include #include #include
2017-06-08 11:11:08
2022
原创 dup和dup2原理
dup 和 dup2 是用来复制一个文件描述符,通常用来重定向进程的stdin(文件描述符0),stdout(文件描述符1), stderr(文件描述符2)。函数原型和参数如下所示:dup只有一个参数,dup2有两个参数。dup()函数 利用函数dup,我们可以复制一个描述符。传给该函数一个既有的描述符,它就会返回一个新的描
2017-06-08 11:00:19
2541
原创 linux 线程池服务器代码
运行结果如下:运行server浏览器连接:server输出源代码如下:/* Linux 2.6 x86_64 only*/#include #include #include #include #include #include #include #include #include #inc
2017-06-03 14:46:20
311
原创 linux进程池
进程池的概念:进程池是由服务器预先创建好的一组子进程,子进程的数量大概在3-10个左右。进程池中的所有子进程都运行着相同的代码,并且有着相同的属性(如优先级)。当接到服务请求后,服务器会通过某种方式从已经存在的子进程中挑选出一个进行服务。方式:1.算法。包括随机算法和轮流算法(Rount—Robin)。2.共享消息队列。进程和所有子进程通过一个共享的工作队列来同步,子进程都睡眠在该
2017-06-03 13:26:06
526
转载 路由表条目生成算法
在linux操作系统下,输入route就可以看到路由表条目,如图:距离矢量算法使用距离矢量算法Bellman-Ford算法 。 这种方法分配一个 成本 数量为每个网络中的每个节点之间的联系。 节点发送信息通过的路径从A点到B点,导致最低的总成本 (即成本之和)使用的节点之间的联系。该算法以一个非常简单的方式运作。 当一个节点第一次启动时,它只知道的邻国,达到他们所涉及的
2017-05-17 17:11:46
880
原创 NAT和代理服务器的原理及应用
NAT原理:NAT网络地址转换(NAT,Network Address Translation)属接入广域网(WAN)技术,是一种将私有(保留)地址转化为合法IP地址的转换技术,它被广泛应用于各种类型Internet接入方式和各种类型的网络中。原因很简单,NAT不仅完美地解决了lP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。NAT的实现方式有三种
2017-05-17 16:47:28
665
原创 RARP应用场景
RARP反向地址转换协议,允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。网络管理员在局域网网关路由器里创建一个表以映射物理地址(MAC)和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器,此机器就会存储起来以便日后
2017-05-11 19:05:13
2193
原创 CRC循环冗余检验
现实的通信链路都不会是理想的。比特在传输过程中可能会产生差错:1可能变成0,而0也可能变成1,这叫做比特差错。CRC循环冗余检验:是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。以上CRC的概念来自百度百科。CRC的具体操作如下:在发送端,在数据M后面添加供差错检测
2017-05-11 18:55:54
1272
转载 守护进程为什么要fork两次?
上一篇博客讲了,fork的作用,那么为什么有时候有些代码会调用两次fork呢?(1)调用一次fork的作用: 第一次fork的作用是让shell认为这条命令已经终止,不用挂在终端输入上,还有就是为了后面的setsid服务,因为调用setsid函数的进程不能是进程组组长,如果不fork出子进程,则此时的父进程是进程组组长,就无法调用setsid。当子进程调用完setsid函数之
2017-05-10 16:13:04
923
原创 linux之守护进程的创建
1.什么是守护进程?守护进程也称精灵进程(Daemon),是运⾏行在后台的⼀一种特殊进程。它独⽴立于控制终端并且周期性地执⾏行某种任务或等待处理某些发⽣生的事件。守护进程是⼀一种很有⽤用的进程。Linux的⼤大多数服务器就是⽤用守护进程实现的。⽐比如,Internet服务器inetd,Web服务器httpd等。同时,守护进程完成许多系统任务。⽐比如,作业规划进程crond等。2
2017-05-10 16:08:40
513
转载 线程安全和可重入函数的关系,区别
•概念重入:即重复调用,函数被不同的流调用,有可能会出现第一次调用还没返回时就再次进入该函数开始下一次调用。可重入:当程序被多个线程反复执行,产生的结果正确。如果一个函数只访问自己的局部变量或参数,称为可重入函数。不可重入:当程序被多个线程反复调用,产生的结果出错。当函数访问一个全局的变量或者参数时,有可能因为重入而造成混乱,像这样的函数称为不可
2017-04-27 23:42:08
782
原创 linux 模拟实现my_sleep的两个版本
1.既然要讲sleep,那么大家就有必要了解一下什么是信号。信号:是UNIX进程间通信的一种标准方式。信号的产生:1.键盘快捷键 2.异常 3.操作系统命令和函数 4.闹钟信号的数量:64种,1-31是普通信号,34-64是是时时信号my_sleep版本one(有bug):#include #include #include #i
2017-04-27 23:39:32
894
原创 (BST)二叉搜索树操作(二)
这篇博客接着上篇博客,主要讲二叉树搜索树的删除操作。如上图,对一个二叉搜索树进行删除操作要分情况讨论。1.要删除的节点没有左右孩子,(如图中的0,或者9); 2.要删除的节点有左孩子,没右孩子(如图中的1);(1)要删除的节点是根节点;(2)要删除的节点不是根节点; 3.要删除的节点没有左孩子,有右孩子(如图中的8);(1)要删除的节点是根节点;
2017-04-21 21:47:51
337
原创 (BST)二叉搜索树的操作(一)
概念:二叉搜索树:又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树1、若它的左子树不为空,则左子树上所有节点的值都小于根节点的值2、若它的右子树不为空,则右子树上所有节点的值都大于根节点的值3、它的左右子树也分别为二叉搜索树/* * 说明1:这篇博客介绍的是二叉搜索树所有操作(除了删除)的非递归写法。 *下一篇博客介绍,二叉搜索树的递归写法,和删除操作。 *
2017-04-21 00:58:26
293
原创 继承中构造函数和析构函数的调用顺序
1 今天在博客上看到一段解释继承中析构函数和构造函数的调用顺序描述,觉得讲的不错,分享给大家,下面的代码是自己的验证。 首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数,只有这样子类才能在构造函数里使用基类的成员,所以是创建子类时先
2017-04-08 01:33:24
719
转载 拷贝构造函数和赋值运算符有哪些不同点和相同点
‘=’只有在赋值时,才调用赋值函数,当在声明变量时,B b3=b1和B b4(b3)调用的函数是一样的,均为拷贝构造函数。 一、拷贝构造,是一个的对象来初始化一边内存区域,这边内存区域就是你的新对象的内存区域赋值运算,对于一个已经被初始化的对象来进行operator=操作class A; A a; A b=a; //拷贝构造函数调用
2017-04-02 19:21:55
3363
原创 string 和 int之间的转化
int转换为string#include /*#include using namespace std;int main(){ //第一种:使用itoa int aa = 30; char c[8]; itoa(aa, c, 10);//此函数是c语言的函数,只能在windows下使用 cout<<c<<endl; //第二种方法:使用sprintf int
2017-03-26 14:38:27
610
原创 自己编写shell
#include#include#include#include#includeint main(){ char cmd[128]; while(1){ printf("[lx@bogon class4]# "); fflush(stdout); ssize_t _s = read(0,cmd,sizeof(cmd)-1); if(_s >
2017-02-23 21:52:12
464
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人