自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)

原创 使用 zabbix-agent 主动模式监控 Windows 主机

使用 zabbix-agent 主动模式监控 Windows 主机安装 zabbix-agentagent下载地址:https://www.zabbix.com/cn/download_agents#tab:32解压后,目录结构如下:使用以下命令进行zabbix-agent的安装和启动:#zabbix-agent 安装脚本F:\zabbix-agent\bin\win64\zabbi...

2019-12-26 21:33:51 663

原创 使用django用户管理模块,实现简单的django用户注册、登录和注销逻辑

使用django用户管理模块,实现简单的django用户注册、登录和注销逻辑1、使用的环境信息 python 3.7.4 django 2.2.3 pycharm 2018.3.6 mysql2、用户模型:from django.contrib.auth.models import UserUser类本身没有定义任何属性,其属性都是继承与父类Abstrac...

2019-07-20 16:40:32 2237

原创 I/O多路转接之select

在完成I/O操作时,程序中完成真正I/O的时间可能只有少的一部分,而大部分时间都处于一个等的时间。比如,此时需要从一个套接字中读取数据read(socket, buf, BUFSIZE); 这个操作可能会一直阻塞,直到有数据从网络的另一端发送过来。等的时间过于长,这是I/O效率低下的真正原因。可能有人会提出让代码不要阻塞的等,可以进行非阻塞的等待,比如当read一个socket发现没有数据时,就不

2017-07-09 23:14:09 369

原创 实现简单UDP服务器客户端模型

UDP是无连接的,在数据的发送之前不需要连接,只需要知道要发数据给谁,然后将数据发出即可,可以直接接收到其他人发来的数据,不必调用listen()和accept()函数。所以UDP中建立好套接字后,就可以直接进行数据的传输。基于UDP的接收和发送函数:#include #include ssize_t sendto(int sockfd, const void *buf,

2017-07-04 16:51:31 748

原创 使用套接字实现简单TCP服务器客户端模型

利用套接字实现一个简单的服务器客户端模型基本步骤如下:1.创建套接字#include #include  int socket(int domain, int type, int protocol);参数描述:     domian:协议域,AF_INET  ipv4, AF_INET6    ipv6,   AF_UNIX   表示这个socket

2017-07-04 10:23:55 522

原创 TCP连接的建立和释放(三次握手和四次挥手)

TCP的连接建立TCP的连接建立也称握手,握手需要在客户机与服务器之间交换三个TCP报文段,下图给出了三次握手建立连接的过程。连接建立的详细过程:①第一次握手 A向B发送连接请求报文段,这时连接请求报文段的首部同部位SYN=1,同时选择是一个初始序号seq=x。(TCP规定SYN=1的报文不能携带数据,但是需要消耗一个序号),这时,A的TCP客户进程进入SYN-SENT

2017-06-29 00:00:11 1319

原创 TCP报文的URG和PSH标志位

URG:紧急标志位,它使一端可以告诉另一端有些具有某种方式的“紧急数据”已经放置在普通的数据流中。另一端被通知这个紧急数据已被放置在普通数据流中,由接收方决定如何处理。该标志位要和紧急指针配合使用。当URG=1时,表明紧急指针字段有效。向系统说明此报文中有紧急数据,应该尽快传送,而不是按照原来的排队顺序来传送。于是发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据之后的数据仍然是

2017-06-28 16:21:49 611

转载 代理服务器原理

原文:http://blog.csdn.net/liangzhao_jay/article/details/12025907代理服务器:代理服务器(Proxy Server):代理服务器,顾名思义就是局域上不能直接上网的机器将上网请求(比如说,浏览某个主页)发给能够直接上网的代理服务器,然后代理服务器代理完成这个上网请求,将它所要浏览的主页调入代理服务器的缓存,然后将这个页面传给请

2017-06-26 01:37:20 432

原创 NAT技术

网络地址转换 NAT(Net Address Translation):它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。因此我们可以认为,NAT在一定程度上,能够有效的解决公网地址不足的问题。NAT技术原理:NAT就是在局域网内部使用内部自己的地址,当内部主机要与外部网络进行通讯时,在网关处,将内部的地址转换为合法的IP地址,从而进行正常的通讯。这种方法最少可以

2017-06-26 00:57:59 578 1

原创 ARP地址解析协议原理

理解ARP协议ARP地址解析协议,是一个很重要的协议。当一个数据帧经过多次路由到达目的网络时,路由器只能知道其数据帧中的目的IP地址,而不知目标主机的硬件地址(网络层使用的是IP地址,但是在实际网络链路上传送数据帧时,最终必须使用该网络的硬件地址),此时需要目的主机的硬件地址,就要使用ARP来获取到对应IP地址主机的硬件地址。注意:ARP是解决同一局域网中主机或者路由器的IP地址和

2017-06-25 23:19:42 5833

原创 CRC校验原理及步骤

什么是CRC校验?CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。CRC校验原理:其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要

2017-06-22 11:59:11 126736 39

原创 端口号

什么是端口?在网络中,主机之间通过TCP/IP协议发送和接受数据报,数据报根据目的主机的 IP进行路由选择。现在多数操作系统都是支持多进程同时运行的,在数据报到达主机后,主机应该将数据报交给同时运行进程中的哪一个进程?因为这个原因,所以引入了端口机制。本地操作系统会给有需求的进程分配协议端口,每个协议端口由一个正整数标识,这个数就称为端口号。在主机接受到数据报时,会根据数据报中目的端口号把

2017-06-21 22:56:15 323

原创 守护进程

什么是守护进程:守护进程是运行在系统后台的一种特殊程序,独立于控制终端并且周期性的执行某种任务或者等待处理某些发生的事件。守护进程也称为精灵进程,有以下特点:自成进程组,自成会话,不受一般用户注销影响在命名上一般以d结尾其本身是一个孤儿进程生命周期长,要7*24小时在线一般的网络服务器必须以守护进程的形式存在守护进程的创建:创建守护进程的关键就是创建一个新的Sess

2017-06-15 23:51:15 344

原创 线程安全和可重入函数

线程安全:一个函数被称为线程安全的,当且仅当被多个进程反复调用时,它会一直产生正确的结果。有四类函数称为线程不安全函数:不保护共享变量的函数函数状态随着调用改变的函数返回指向静态变量指针的函数调用线程不安全函数的函数要确保函数线程安全,主要需要考虑的是线程之间的共享变量。属于同一进程的不同线程会共享进程内存空间中的全局区和堆,而私有的线程空间则主要包括栈和寄存器。因此,

2017-06-13 11:12:39 504

原创 一个进程为什么会默认打开三个标准输入输出

这其中涉及到终端登录的问题,先对终端登录进行小总结:init在创建子进程后,子进程一直进行程序替换完成必须的处理动作,最后替换到bash,也就是我们所工作的环境,所以也就解释bash的父进程就是init,init为什么是1号进程。从getty开始exec到login,再exec到bash,其实都是同一个进程,因此控制 终端没变,文件描述符0、1、2也仍然指向控制终端。由于fork会

2017-06-11 23:05:07 987

原创 Linux子进程的异步等待方式(SIGCHLD信号)

当一个父进程创建一个子进程时,最好要调用wait或者waitpid函数等待子进程,不然会产生僵尸进程造成是内存泄漏的问题。一般父进程在等待子进程时有两种方式等待,一种是阻塞式等待,这时父进程不能处理自己的工作;另一种是以非阻塞式等待,父进程吃力自己工作的同时,要定时去查看有没有子进程等待清理。我们可不可以实现更加高效的方法,让父进程在子进程退出后马上去回收,也不用去阻塞等待或者定时查看有没有子

2017-06-11 11:22:31 1096

原创 死锁概述

什么是死锁?把多个进程因抢占资源,或者彼此间通信造成的一种僵局,在没有外力推动的作用下进程不能继续运行下去的这种状态称为死锁。比如,有两个进程p1和p2,他们准备写两个文件f1和f2,两个进程并发运行:如果p1先打开f1和f2,然后p2才去打开f1和f2,这时文件也已经被打开,p2会被阻塞。当p1完成写入时而关闭f1和f2,此时p2会有阻塞状态转为就绪状态,会重新去打开f1和f

2017-06-09 15:39:34 260

原创 Linux信号捕捉

内核是怎样实现信号的捕捉呢?处理流程如下图所示:系统往往在从内核态切回用户态时会进行信号的处理。信号捕捉函数:sighandler_t signal(int signum, sighandler_t handler);int sigaction(int signo, struct sigacton *act, struct sigaction* oact);

2017-06-09 15:28:36 378

原创 Linux信号

当我们在终端运行这样的程序时#includeint main(){ int count = 0; while(1) { sleep(1); printf("%d\n", count++); }}我们可以看到每隔一秒会将count++然后输出到显示器,但是这个时候要结束掉这个进程该怎样做呢?很简单,我们可以使用Ctrl+c组合键来直接结

2017-06-06 18:54:34 248

原创 Linux共享内存实现进程间通信

原理图:通过在物理地址上开辟出一块内存,通过页表建立多个进程的虚拟内存与这块内存的映射让进程可以访问这块空间,映射一旦建立就相当于自己拥有了这块内存。特点:通信速度快;生命周期随内核;不带任何同步机制,所以常常和信号量一块使用。共享内存的操作:创建:int shmget(key_t key, size_t size, int shmflg);

2017-06-03 00:53:23 279

原创 Linux消息队列实现进程间通信

什么是消息队列:消息队列提供了从一个进程向另一个进程发送一个有类型数据块的方法。用这种方法可以避免命名管道的同步和阻塞问题。消息队列是基于消息的,而管道是基于字节流的,并且消息队列的读取不一定是先入先出。消息队列的操作:消息队列的创建或者获取:int msgget(key_t key, int msgflg);参数描述:key:是一个端口号,可以由ftok()生成

2017-06-02 23:58:53 1517

原创 Linux信号量

【信号量】本质:信号量本质就是一个计数器,用于统计临界资源数目的计数器,信号量是用来调协进程 对共享资源的访问。【信号量的工作原理 】由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),他们的行为是这样的:P(sv):如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行。V(sv):如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有

2017-06-02 17:02:26 453

原创 Linux利用信号量实现线程的同步与互斥

线程使用互斥锁可以实现线程间的互斥,而互斥锁本身就是对资源的一种标识状态,当可以申请到锁时说明此时资源可以使用,当申请锁失败时说明资源此时被其他线程所占用不可使用,我们可以使用信号量来代替互斥锁实现。信号量用来表示资源数目,当一个线程要去访问资源时,必须先去申请信号量,如果可以获取到信号量那么该线程就可以正常运行,如果获取资源失败那么就需要去等待。当一个线程获取到信号量并且执行完成后必须去

2017-06-01 12:21:27 1553 2

原创 Liunx线程的同步

什么是线程间的同步:对于可以处理同一公共资源的线程来说他们必须是互斥的,这样才能保证数据的正确性。可是就这一种关系仍然不能处理好这些线程之间的问题。比如,两个线程可以访问同一块缓冲区,线程1可以往里面写数据,线程2可以从中读数据,要是数据远远大于缓冲区的大小时,这时当线程1写满缓冲区时,就不能在写入了,必须等到线程2去读掉缓冲区的数据之后才能在写入。所以最好的做法就是在线程1写满时,去通知

2017-05-31 12:29:45 230

原创 Linux利用mutex互斥锁实现线程的互斥

在多个线程对共享数据进行处理时,可能会发生冲突从而导致数据结果与预期结果不一样,导致程序运行错误。例:在一个主线程中有两个线程,这两个线程都对全局变量num进行+1操作。注意:上述说的例子可能不会发生,只有当线程1还未将num的新值写入内存时突然被切换到线程2才可能发生。           线程间的切换会在系统由内核态切换到用户态时可能发生。系统在运行系统调用时会

2017-05-30 17:28:52 1150

原创 Linux之线程的创建、等待、终止及分离

线程概念:线程是在进程内部运行的(也就是在进程的地址空间内运行的),是进程的一个执行分支。线程与进程的区别:Linux下线程是在进程的地址空间内运行的,线程拥有进程的一部分资源与代码,是进程的一个执行分支线程是cpu的基本调度单位进程是承担资源分配的基本单位Linux下进程被称为轻量级进程Linux下无真正意义的线程,线程是用进程模拟实现的线程之间有共享的资源:

2017-05-30 01:55:16 731

原创 AVL树的实现

AVL树:AVL树也成为平衡二叉树,它是这样定义的:一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:1、它的左右子树都是AVL树2、左子树和右子树高度之差(简称平衡因子)的绝对值不超过1(-1、0、1)AVL树的插入:在插入节点后会造成父节点的平衡因子发生改变,需要从下往上更新平衡因子,若某一节点的平衡因子的绝对值大于1,说明以这个结点为根的树已经不

2017-05-24 00:49:02 320

原创 Linux利用管道实现进程间通信

系统中,进程之间独立性大,互相的影响较小,所以造成进城之间相互通信的难度较大。所在想办法让进程去看到一份相同的公共资源(一般操作系统提供,这资源不属于任何进程),以这样的方式实现进程的通信。用管道实现进程间通信的原理:如下图所示匿名管道(pipe)【匿名管道的创建】int pipe(fd[2]);这是一个系统调用接口,创建一个匿名管道文件。【函数具体

2017-05-18 16:34:25 673

原创 二叉树中序遍历

递归版本:void _InOrderR(Node* pRoot) { if (NULL == pRoot)//出口 return; _InOrderR(pRoot->LC);//访问左子树 cout data << " ";//访问结点 _InOrderR(pRoot->RC);//访问右子树 }非递归版本:void _InOrderNor(Node* pRo

2017-05-12 15:47:15 202

原创 二叉树前序遍历

递归版本:void _PreOrderR(Node* pRoot) { if (NULL == pRoot)//出口 return; cout data << " ";//对节点进行访问 _PreOrderR(pRoot->LC);//访问左子树 _PreOrderR(pRoot->RC);//访问右子树 }非递归版本:基本思想,先对结点进行访问,在

2017-05-12 15:30:22 174

原创 二叉树后序遍历

递归版本:void _PostOrderR(Node* pRoot) { //递归出口 if (NULL == pRoot) return; //遍历左子树 _PostOrderR(pRoot->LC); //遍历右子树 _PostOrderR(pRoot->RC); cout data << " "; }非递归版本:void _PostOrd

2017-05-06 00:37:33 217

原创 递归形式二分查找

在进行二分查找时,最需要注意的有以下几点:

2017-04-14 22:09:44 294

原创 带有虚函数的菱形继承和带有虚函数的菱形虚继承

对于某些函数来说,基类希望它的派生类定义适合自身的版本,此时基类就将这些函数声明为虚函数。在存在虚函的类,创建对象时会产生虚表指针,虚表指针指向一个虚表,这时就可以通过虚表访问自己定义的函数。通过下面两种继承进行分析:【带有虚函数的菱形继承】以下图的模型为例进行分析:class A{public : A() :a(1) {}

2017-04-12 19:10:11 2116 2

原创 菱形继承和菱形虚继承

继承是C++的一大特点,我们通过菱形继承和菱形虚继承对继承进行进一步的分析。【菱形继承】创建一个基类A让B1和B2公有继承于它,让C公有继承B1和B2。class A{public : A() :a(1) { cout << "A()" << endl; } ~A() { cout << "~A

2017-04-08 09:05:03 839

原创 关于scoped_ptr和scoped_array

scoped_ptr是Boost库中的一个只能指针,它和auto_ptr非常类似,可以完成资源的自动释放。scoped_ptr与auto_ptr的区别在于,auto_ptr可以实现资源的转移,但是scoped_ptr禁止了资源的转移,它让一个对象拥有了对资源的彻底掌控。下面代码模拟实现了scoped_ptr:template class ScopedPtr{public: S

2017-04-05 16:11:12 551

原创 关于auto_ptr

在C++中因为没有自动内存回收,自己开辟的空间总是要自己去维护 ,必须保证在出作用域或者程序运行完成退出之前释放掉自己申请的空间,否则就会造成内存

2017-04-05 15:22:57 318

原创 Linux下设置粘滞位防止其他用户删除当前用户文件

通常有这样的情况,有多个用户需要向一个文件夹内放置文件,但是他们不能互相删除对方的文件,设置用户权限可以实现么?用root用户创建一个文件夹,给以777的权限然后在这个文件夹下面创建一个文件test发现它的权限为644切换到普通用户,进入file文件夹,对于普通用户来说test文件权限是只读的,却发现普通用户可以删除test文件我们可以通过设

2017-03-28 15:25:10 1669

原创 Linux的find命令

Linux下find命令具有强大的查找功能,它可以完成各种情况的查找工作,所以find命令有很多选项。【命令功能】     用于在文件数中查找文件,并做出相应的处理(可能访问磁盘)【命令格式】     find pathname -options [-print -exec -ok ......]【命令参数】     pathname : find 命令所查找的目录

2017-03-28 14:58:17 1229

原创 用冒泡排序模拟实现qsort

在学习使用过qsort之后,一直在想是否能用其他的排序算法去模拟实现它的功能,把自己的实现写出来,也是对自己的一种总结吧。因为模拟是实现qsort,实现原理与qsort基本相同所以,给出和它一样的参数列表。void BubbleSortNoType(void *arr, int dataNum, int typeSize, Fun fun)//数组地址,元素个数,元素类型大小,比较

2017-03-22 22:05:18 321

原创 求一个数字二进制中1的个数

1.一个很简单的思路,把每一位与1相与如果结果是1,就代表这一位是1,相反是0int BinaryNumOne1(int num){ int count = 0; while (num) { if (num & 1) { count++; } num = num >> 1; } return count;}

2017-03-21 21:09:25 217

空空如也

空空如也

空空如也
提示
确定要删除当前文章?
取消 删除