自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(85)
  • 收藏
  • 关注

原创 appium环境搭建

  appium环境比较复杂,本章总结了搭建appium环境的过程。  一、安装Android SDK  下载地址:https://pan.baidu.com/s/1nHqREoLcDPxwGav1CQ0J9w   提取码:m9ch   1. 下载Android SDK包,进行解压;   2. 进入Android SDK/sdk/目录,找到platform-tools与tools目录...

2019-02-19 22:15:30 355

原创 正则表达式的学习

       正则表达式:处理字符串的方法,以行为单位处理字符串,其通过一些特殊符号的辅助,可以使用户轻易的进行查找、删除、替换某特定字符串的处理程序。       支持正则表达式表示法的工具程序:grep、vi、awk、sed       正则表达式分类:1)基础正则表达式;2)扩展正则表达式       而在学习正则表达式之前,首先学会工具程序grep的用法: grep [-...

2018-11-28 21:37:34 385

原创 安卓APP稳定性测试-----monkey

      稳定性测试:通过在主流真机终端上,模拟真人对App的操作行为,支持自动登陆、运行时间可配置,有效点击覆盖更全更深,从而发现程序的Crash及ANR,一般使用monkey对应用程序进行稳定性测试。      monkey:Android SDK自带的命令行测试工具,向设备发送伪随机事件流,可以在模拟器里或实际设备中运行,它向系统发送伪随机的用户事件流,如按键输入、触摸屏输入、手势输入...

2018-10-11 16:10:50 1926

原创 tomcat学习

一、tomcat总体介绍:免费开放源代码的web应用服务器;单独的web服务器使用,也可以和其它的web服务器配合使用,58:nginx+tomcat(nginx处理静态资源,效率较高,可以处理几万到十万的并发,tomcat是java web 容器,处理java资源,nginx与tomcat通过反向代理进行数据的流转);tomcat实现了jsp与JNDI的api的实现,不包括其余所有java EE...

2018-02-26 14:33:29 404

原创 mysql学习

mysql:关系型数据库,理解为表格的概念,为多种编程语言提供了 API。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby、.NET和 Tcl 等。 登录使用mysql: 当 MySQL 服务已经运行时, 我们可以通过MySQL自带的客户端工具登录到MySQL数据库中, 首先打开命令提示符, 输入以下格式的命名:mysql

2018-01-23 13:36:54 405

原创 epoll服务器

相比select、poll,epoll是I/O多路转接最高效的手段,它几乎具备了之前select、poll的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。epoll实现只有epoll_create()、epoll_ctl()、epoll_wait()三个系统调用函数。1、epoll_create()函数:int epoll_create(int size);含义:创建一个e

2017-08-17 17:03:25 960 1

原创 webbench剖析

webbench:其为linux上一款web性能压力测试工具,它最多可以模拟3万个并发连接数来测试服务器压力,其原理为fork多个子进程,每个子进程都循环做web访问测试,子进程将访问的结果通过管道告诉父进程,父进程做最终结果统计。其主要原理如下图: 其代码实现中主要运用4个函数:getopt_long()系统命令行解析函数,build_request()函数,bench()函数,benchcor

2017-07-27 18:57:10 7729 2

原创 shell命令代换与eval命令

命令代换:在shell中用以下两种方式实现命令代换:`COMMAND` //反引号$(COMMAND) //$()命令代换即首先执行反引号或括号里的命令,将其结果立刻代换到当前命令行中或者代换赋予一个变量: 如下图,在一个shell脚本中打印日期: 以上执行过程中:第一种先执行反引号与()中date命令,执行完成,结果代换到命令行中然后用echo命令输出;第二种先执行了$()中的dat

2017-07-15 17:10:23 715

原创 TCP四次挥手后的TIME_WAIT状态

首先查看TCP建立连接与断开连接的两对端的状态图,如下: 由图可知客户端在收到服务端的请求断开连接带有的FIN位结束报文段,并发送ACK确认以后,其并没有直接关闭,进入到CLOSED状态,而是转变为TIME_WAIT状态。TIME_WAIT状态是做什么的? 在这个状态,顾名思义,即客户端连接要等待一段长为2MSL(报文段最大生存时间)的时间,才能关闭连接,在标准文档RFC 1122的MS

2017-07-14 15:45:31 1717

原创 复杂链表复制

#include <iostream>using namespace std;//复杂链表的复制struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) :label(x) ,next(NULL)

2017-07-13 18:14:20 405

原创 合并两有序链表

struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};class Solution {public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2

2017-07-13 18:04:20 382

原创 TCP三次握手与四次挥手

TCP建立连接与断开连接的过程如下图: TCP连接断开其状态转移路线如下: 其中以上1,2,3段则代表的为TCP建立连接的时的三次握手,过程如下:客户端client主动发起请求连接,发送携带SYN标志同步报文段1,并包含一个ISN值为1000的序号,并指定自己的最大段尺寸mss为1460等; 其代表含义为:序号是1000,这个序号在⽹网络通讯中⽤用作临时的地址,每发一个数据字节,这个

2017-07-13 16:14:05 542

原创 poll服务器

poll是I/O复用多路转接的另一种方法,其优化了select两个缺点:poll服务器支持的文件描述符数目没有上限;poll服务器函数接口的参数与select不同,其将输入与输出参数进行了分离(用结构体实现).函数如下:#include <poll.h>int poll(struct pollfd* fds,nfds_t nfds,int timeout);参数含义:fds:结构体数组,(

2017-07-10 21:31:11 785

原创 select服务器

unix下,可将I/O分为五种模型:阻塞I/O非阻塞I/OI/O复用(多路转接:select、(e)poll)信号驱动异步I/O其中前四种I/O模型为同步I/O,最后一个为异步I/O,而一个I/O操作可分为两步:等待数据就绪;数据的搬移.而高性能I/O则体现在如何减少等待的时间,即在I/O模型中的I/O复用则是通知底层I/O就绪的高效方法。 系统提供select函数来实现多路复用

2017-07-08 14:22:57 591

原创 多进程多线程TCP服务器

在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”称为(套接字)socket。在TCP协议中,建立连接的两个进程各自有一个socket来标识,这两个socket组成的socket pair就唯一标识一个连接。 TCP/IP协议最早在BSD UNIX上实现,为TCP/IP协议设计的应用层编程接口称为socket API。此处使用socket A

2017-07-04 10:18:07 1051

原创 arp脚本

在网络的分层中,网络层最重要的协议为IP协议,与IP协议配套使用的还有四个协议:(1)ARP(地址解析协议);(2)RARP(逆地址解析协议);(3)ICMP(网际控制报文协议);(4)IGMP(网际组管理协议).如图:

2017-06-24 19:44:30 1350

原创 剑指offer-删除链表重复节点

#include using namespace std;struct Node{ int data; Node* next; Node(int x) :data(x) ,next(NULL) {}};void PushBack(Node** pHead,int x){ if(*pHead==NULL) { *pHead=new Node(x); } e

2017-06-23 23:16:46 935

原创 单例模式的实现

#include using namespace std;//单例模式:即单个实例的模式(面向对象,一个类只允许产生一个实例,自行实例化,并提供全局的访问方法)//分类://1.饿汉单例:在使用前对象已创建完成,即使还未使用对象,其也一直存在//实现:用一个已初始化的静态对象指针,用一个接口提供其给用户使用,再将构造函数设为私有,//所以用户只能使用这个接口得到这个对象,由于此成员对象

2017-06-23 19:03:02 734

原创 端口分类调研

目的主机收到数据包后,经过各层协议栈最后到达应用程序的过程:(1)以太网驱动程序首先根据以太网首部中的“上层协议”字段确定该数据帧的有效载荷(payload,指除去协议首部之外实际传输的数据)是IP、ARP还是RARP协议的数据报;(2)交给相应的协议处理:假如是IP数据报,IP协议再根据IP首部中的“上层协议”字段确定该数据报的有效载荷是TCP、UDP、ICMP还是IGMP;(3)再

2017-06-21 23:02:50 1435

原创 C++如何只能在堆上或栈上生成对象

#include using namespace std;//只能在栈上构造对象的实现:即不能调用new来在堆上构造对象,调用new其会调用operator new(),//所以只要显示定义重载一下operator new() operator delete()操作符设为私有部分//类外就无法调用new/delete在堆上建立释放对象了。class B{public: B()

2017-06-21 21:12:18 889

原创 CRC校验

数据链路层有三个基本问题:(1)封装成帧;(2)透明传输;(3)差错检测:在差错检测中,传输差错中分为两大类:1.比特差错:比特在传输过程中产生差错:1可能变为0,0可能变为1.   在一段时间内,传输错误的比特占所传输总数的比特总数的比率称为误码率.2.帧丢失、帧重复或帧失序:如//3个帧 [#1]-[#2]-[#3][#1]-[#3]

2017-06-20 23:34:12 1457

原创 守护进程

守护进程:Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其它进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着,这种进程称作守护进程;守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种

2017-06-16 15:37:04 912

原创 序列式容器:vector

vector:连续的线性空间,与array唯一的区别在于其空间的动态配置。其有自己的迭代器,由于它空间连续,所以不论其元素型别为何,普通指针可以作为vector的迭代器,如下:typedef T value_type;typedef value_type* iterator;typedef size_t size_type;typedef value_type& refer

2017-06-13 11:12:50 709

原创 子进程的异步等待方式

SIGCHLD:子进程在终止退出时会给父进程发SIGCHLD信号,该信号的默认处理动作是忽略。验证如下:创建一个子进程,自定义信号SIGCHLD的捕捉函数,若子进程退出并调用了此信号捕捉函数,则验证成功。#include #include #include #include #include void myhander(int sig){ printf("father ge

2017-06-11 15:09:24 693

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

重入:当不同的控制流程调用同一个函数时,有可能当一个调用还没返回时,另一个调用就进入了该函数,将其称作重入;不可重入函数:当一个函数由于可重入出错,则将此函数称为不可重入函数;可重入函数:当一个函数由于可重入而不影响正确结果(其只访问自己的局部变量和参数),将此函数称作可重入函数;举例:常见情况中,当程序正在执行到某一个函数中的某一条指令时,这时其收到了一个信号,于是其暂停执行去处理信

2017-06-09 18:59:30 815

原创 信号的捕捉

信号的捕捉在Linux下机制:如图由此可知此机制下发生了四次的模式切换:用户态--->内核态、内核态--->用户态、用户态--->内核态、内核态--->用户态,从中也可以看出进程处理信号的时机是从内核态切回到用户态时候,若这时有信号可以递达则去执行其自定义处理动作,具体执行完成以后则在返回到用户态main函数继续上下文执行,若处理动作为退出则就直接退出。注意:自定义捕捉函数和mai

2017-06-09 17:00:33 802

原创 死锁及避免死锁的银行家算法

Linux下:互斥锁是保护临界资源被线程间(或进程间)互斥的访问临界资源,当一个线程得到锁不释放时另一个线程申请时必须等待,由此可以得到概念:死锁:(两种情况)(1)同一个线程先后两次调用lock,在第二次调用时,由于锁已经被自己占用,该线程会挂起等待自己释放锁,由于该线程已被挂起而没有机会释放锁,因此 它将一直处于挂起等待状态,变为死锁;(2)线程A获得了锁1,线程B获得了锁2,

2017-06-08 23:53:03 14048 4

原创 消费者生产者模型

消费者生产者模型:某个模块负责产生数据,这些数据由另一个模块来负责处理,产生数据的模块,形象地称为生产者,而处理数据的模块,就称为消费者,该模式还需有一个缓冲区处于生产者和消费者之间,作为一个中介,生产者把数据放入缓冲区,而消费者从缓冲区取出数据。如图:生产者消费者模型可分为:1.三种关系:   生产者与生产者(互斥)   消费者与消费者(互斥)   生产者与消费者

2017-06-08 14:47:05 1004

原创 线程同步与互斥

互斥:多线程环境下,当所有线程同时访问共享数据时,可能产生冲突,需要使在任一时刻有且只有一个线程访问其共享数据,保证其原子性。线程中实现互斥可运用互斥锁(mutex)来实现,其可相当于进程之间的二元信号量:函数如下:#include //定义初始化一把互斥锁pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; //全局、静态用宏初始化

2017-06-07 14:57:37 907

原创 Linux下信号--阻塞信号

这篇博客http://blog.csdn.net/l_xrui/article/details/72885978讲了信号的基本概念与产生方式。了解以下三种概念:信号递达(Delivery):实际执行信号的处理动作(三种);信号未决(Pending):信号从产生到递达之间的状态;信号阻塞(Block):进程可以选择阻塞某个信号,被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号

2017-06-07 00:00:26 1262

原创 Linux下信号与Core Dump(gdb调试)

信号:当一个进程产生异常、中断等时,操作系统则给进程发送一个信号,即向进程PCB中写入一个信息(此处即修改一个比特位(位图实现),表示进程是否收到该信号),当进程确认收到该信号则会在恰当的时间去执行其对应的相关处理动作。三种处理动作:1.忽略此信号;2. 执行该信号的默认处理动作(一般都为终止此进程);3. 提供一个用户自定义信号处理函数,内核处理时切换到用户态执行,即为信号的捕捉

2017-06-06 20:41:52 2556

原创 进程间通信-信号量

信号量:以保护进程互斥与同步为目的,本质上为计数器,记录与统计临界资源的数目。当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值来判断资源是否可用:1.大于0,资源可以请求,等于0,无资源可用,进程会进入睡眠状态直至资源可用;2.当进程不再使用一个信号量控制的共享资源时,信号量的值+1(对信号量的值进行的增减操作均为原子操作,这是由于信号量主要的作用是维护资源的互斥或多进程的

2017-05-24 00:08:36 889

原创 进程间通信-共享内存

共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC通信形式。是针对其他通信机制运行效率较低而设计的,往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。机制如下:特点:1.内存共享是进程间通信速度最快的:由上图可知,内存共享是进程1从其地址空间直接写到物理内存中,进程2则直接通过地址空间虚拟地址从内存中取,不需要通过进入内核来传递消息,而消息队列,

2017-05-23 22:54:26 994

原创 多线程编程-线程控制与属性(结合与分离)

进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,而当需要在一个进程中同时执行多个控制流程并发执行多个任务时,多线程即为出现。在linux下,一个进程中的多线程都在进程的地址空间中运行,它的控制流程可以长期并存,操作系统会在各线程之间调度和切换:特点如下1.线程都在当前进程的地址空间中运行,如图:创建一个进程需要创建自己的地址空间,创建页

2017-05-23 17:03:23 1109

原创 进程间通信-管道与管道容量

匿名管道是一种最基本的IPC机制,由pipe函数创建:#include int pipe(int filedes[2]);参数:输出型参数,调用pipe函数时在内核中开辟一块缓冲区(称为管道文件)用于通信,它有一个读端一个写端,然后通过filedes参数传出两个文件描述符,filedes[0]=3指向管道的读端,filedes[1]=4指向管道的写端。返回值:pipe函数调用成功返回

2017-05-17 23:27:49 1571

原创 进程间通信--消息队列

进程间通信:每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据走,内核提供的这种机制称为进程间通信。通信分类:匿名管道,命名管道,消息队列,信号量,共享内存。消息队列:消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法,每个数据块

2017-05-17 00:05:04 1291

原创 Linux中shell的模拟实现

shell:Linux下,shell为操作系统的外壳,为用户提供了使用操作系统的接口,它是命令语言、命令解释程序及程序设计语言的统称。主要功能:(1)命令解释器;(2)作为一种高级程序设计语言可以编写出代码简洁、功能强大的程序。在这里主要简单实现其一大功能:命令解释器(包括重定向>的实现)主要过程:当一个用户登录后,系统会启动一个默认的shell程序:1.可以看到一个字符串和she

2017-05-09 21:04:38 3367

原创 宏总结

宏即代码替换,它可以替换数值字面值常量,字符串等非整型以及函数替换。如:#define MAX 1024 #define STRING "stringstring"#define SWAP(a,b) {a=a+b;b=a-b;a=a-b}1.宏的执行速度较快,一个程序到执行经过四个步骤,预处理、编译、汇编、链接,而宏则在预处理阶段已经将其代表的代码替换到程序中了;对于函数每次执

2017-04-19 15:19:40 866

原创 C语言实现继承与多态

在前面博客已经详细讲过C++中继承与多态的概念,在这里则只使用C语言的语法来实现继承与多态。继承:即派生类中拥有基类的成员变量和成员函数,所以C语言实现如下:#include typedef void(*Func)(void);void funB(){ printf("B::funB()\n");}typedef struct B{ int _b; Func _fb

2017-04-18 19:21:54 924

原创 函数的可变参数列表

可变参数的产生:首先看一段简单求平均数代码:int average(int num,int v1,int v2,int v3,int v4){ return (v1+v2+v3+v4)/num;}#include int main(){ int ret=average(4,1,4,5,6); printf("%d\n",ret); return 0;}此代码中求平均值函数中

2017-04-18 18:16:03 1261

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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