自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 Qt配置ROS环境

ROS Qt Creator Plug-in 4.5是一个Qt的第三方插件,可以使用Qt方便地在ROS环境编程,比使用VIM或先在Windows下编程再去Ubuntu环境更新程序方便的多。无需安装Qt Creator,直接安装Qt的插件Xenial Offline Installer,链接在这里下载装好以后,启动桌面的Qt Creator (4.5.1),注意不是原来的Creator。打开...

2018-09-14 23:16:37 906

原创 守护进程

守护进程是一种后台进程,类似Windows服务,它脱离终端运行,不能直接和用户交互,不受登陆注销影响,周期性执行任务,一般网络服务都以守护进程的形式运行。守护进程程序的名称通常以字母“d”结尾,例如syslogd就是指管理系统日志的守护进程。查看守护进程的方法: ps -ajx,进程中带-1的是守护进程 ps -eo pid,sid,tty,cmd,进程中tty对应?且pid和sid不同...

2018-08-30 19:50:33 120

原创 互斥锁,读写锁,条件变量,自旋锁

互斥锁在多线程的情况下,当一个变量可以被多个线程修改时,就需要考虑多线程同步问题。线程A修改变量前,先加锁,修改结束再解锁,然后线程B获取同样的锁,修改结束再解锁,如果不是同一把锁,同步是无效的。在C++中使用pthread的互斥量接口实现数据同步,线程A对互斥量mutex加锁后,其他尝试加锁的线程都会阻塞,等线程A解锁后,其他线程从阻塞变为运行态,第一个抢到CPU的线程加锁成功,其他线程...

2018-08-30 19:50:16 659 1

原创 Linux进程分析(三) fork循环创建Linux子进程

forkfork的意思是复制进程,就是把当前的程序再加载一次,加载后,所有的状态和当前进程是一样的(包括变量)。fork不象线程需提供一个函数做为入口, fork后,新进程的入口就在 fork的下一条语句。 返回值为pid_t,实际是unsigned int:子进程中为0,父进程中为子进程ID,出错则为-1。开始写了几个都不成功,最后终于成功了:pid_t p = getpid(...

2018-08-30 19:49:54 914 1

原创 Linux进程分析(二) 父子进程与进程组

ps命令一般用来显示终端信息和进程信息,运行命令ps -eo pid,comm,cmd可以输出所有进程的信息,e代表所有进程,后面三个参数是需要输出的信息。第一列PID是一个整数,每一个进程都有一个唯一的PID来代表自己的身份,进程也可以根据PID来识别其他的进程。第二列COMMAND是这个进程的简称。第三列CMD是进程所对应的程序以及运行时所带的参数。 PID为1的进程是systemd...

2018-08-30 19:49:36 1527

原创 Linux进程分析(一) 虚拟内存和物理内存

物理内存面临的问题问题 1我们现在常用的电脑有32位和64位,这里以32位为例。32位的系统可用的地址空间有就是2的32次方,即4G,现在的电脑物理内存大多都在4G以上,可以前的电脑内存都达不到4G,我们的程序希望能用4个G,这也就是内存面临的第一个问题:物理内存小于系统位数的要求大小该怎么处理? 问题2程序直接使用物理内存,会出现没有连续可用空间的情况,也是不能最大利用...

2018-08-30 19:49:17 3052

原创 基于信号量的生产者-消费者

信号量是进化版的互斥锁,互斥锁只能供一个线程使用,信号量可以供多个线程使用。如果希望在多个线程之间对某对象的部分数据共享,互斥锁无法实现,只能将整个数据锁住,这样导致线程并发性下降。 信号量既能保持同步,数据又不混乱,又能提高线程并发。主要函数:int sem_int(sem_t* sem, int pshared, unsigned int value); //初始化信号量i...

2018-08-30 19:46:47 193

原创 char数组和指针问题

这个问题是C++基础问题中相当折腾人的一个,死记硬背解决不了根本问题,记住还是要忘,需要仔细研究其本质。这两种方式就是数组和指针的方式:char a[6] = "abcde";char *b = "abcde";第一行声明了并初始化了一个char数组,第二行是声明char指针b,指向了常量字符串。其中a是数组的首地址,a和b的地址一定不同。千万不能说数组名是指针,可以用siz...

2018-08-30 19:45:33 980

原创 fprintf,snprintf和sprintf函数

fprintf原型:extern int fprintf (FILE *f,const char *s, ...); 可以将字符串输出到某文件中,但更常用的用法是:fprintf(stdout,"Hello\n"); //加换行fprintf(stderr,"World!");输出Hello换行World。stdout是行缓冲的,输出会放在一个buffer里面,只有到换行的...

2018-08-29 16:59:57 156

原创 静态变量和静态函数

对于类的静态成员变量,只有static const int类型和 enum 类型能在类里面初始化,其他只能在.cpp里初始化,但不能在类体内初始化,因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。静态成员函数和静态变量在类体外初始化时,无须加static关键字,否则是错误的。静态变量不参与sizeof计算静态成员仍然遵循public,privat...

2018-08-29 16:59:32 401

原创 常用shell命令

查找字符串grep -r "struct event_base {" -n 在当前目录查找字符串,找到后返回文件和对应的行 统计文件行数、字节、字数wc命令,选项-l, -c, -w分别统计行数、字节、字数,可统计多文件,但不能统计目录。wc -c main.cppwc -l *.cppwc -l main.cpp test.cpp t.cpp //统计三个文件...

2018-08-29 16:58:35 97

原创 安装配置qt_eventdispatcher_libevent

QT默认的是使用select模型的,这种轮询方式非常慢。在高并发连接,我们需要epoll才能发挥linux服务器的性能. 安装qt_eventdispatcher_libevent下载安装包后,解压,找到src目录,用Qt打开pro工程,然后qmake, build。编译完成后,在lib文件夹里增加三个文件:pkgconfig目录,libeventdispatcher_libevent....

2018-08-29 16:57:40 403

原创 window下apache安装和配置

下载32位: http://httpd.apache.org/ 64位: http://www.apachelounge.com/download/安装解压Apache2.4到F:\Apache2.4 修改文件F:\Apache2.4\conf\httpd.conf:服务根目录:ServerRoot的参数改为F:\Apache2.4服务端口号:Listen 80 修改...

2018-08-29 16:57:05 1112

原创 libevent安装配置

Libevent的特点: 1. 基于事件驱动 2. 轻量级,源码精炼,不像ACE那样庞大臃肿 3. 跨平台 4. 支持多路I/O从网上下载安装包后放到目录解压,到libevent-2.1.8-stable目录下依次执行:./configuremakesudo make install编译完成的库文件在libevent-2.1.8-stable/.libs中,有libev...

2018-08-29 16:55:08 411

原创 退出与报错函数

exit函数exit中的参数exit_code为0代表进程正常终止,若为其他值表示程序执行过程中有错误发生。出错时退出一般用exit(EXIT_FAILURE);errnoerrno表示错误代码。 记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义。系统每一次出错都会对应一个出错代码,例如12表示“Cannot allocate memory”。st...

2018-08-29 16:54:02 406

原创 memset和memcpy函数

memset函数原型:void *memset(void *s, int ch, size_t n); 作用:将s所指向的内存中的前n个字节的内容全部设置为ch指定的ASCII值,这个函数通常为新申请的内存做初始化工作。一般用于结构体和数组的初始化。memset中的第三个参数一定要使用sizeof操作符,因为每个系统下对类型长度的定义可能不一样。memset中的第一个参数一定要是一个...

2018-08-29 16:53:11 88

原创 strcat strcpy strlen strcmp

strcat我自己写的是这样:char* _strcat(char *_Dest, const char *_Source){ assert((_Dest != NULL) && (_Source != NULL)); char* p= _Dest; while(*p!='\0') { p++; } co...

2018-08-29 16:52:51 105

原创 不要显式调用构造函数和析构函数

常用的代码如下:Base b;cout<<"hello"<<endl;结果:基类构造 0x62fe84hello基类析构0x62fe84但是这样的代码就不同了:Base(); //匿名的临时对象cout<<"hello"<<endl;运行结果:基类构造 0x62fe84基类析构0x62fe...

2018-08-29 16:52:01 346

转载 select poll epoll

Selectselect本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,select在socket编程中还是比较重要的。一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程...

2018-08-15 19:51:52 106

原创 函数在main之前或之后运行

C++中,全局对象的构造函数在main之前运行,析构函数在main之后运行。类静态变量的初始化在main之前,静态函数不行。class Base{public: Base() { std::cout<<"基类构造"<<endl; } ~Base() { std::cout<&lt...

2018-08-09 22:43:01 228

原创 结构体与类的字节对齐(终极方案,简单易懂)

字节对齐终于搞清楚结构体的字节对齐怎么计算了,看了那么多博客,好多都不靠谱,最后看了一个老外的讲解,没用3分钟就明白了。主要是两条规则: 1. 某个类型变量是否需要补位,取决于之前所有变量所占内存字节数是否是它的整数倍,若是则不必补位,不是则补齐。 2. 结构体总大小必须是最大成员变量大小的整数倍直接看几个例子: 1. typedef struct bb{ int id;...

2018-08-06 23:12:58 940 1

原创 单例模式

应用实例: 1、日志类,一个应用往往只对应一个日志实例。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。3.windows系统的任务管理器就是一个例子,总是只有一个管理器的实例。优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。 2、避免对资源的多重占用...

2018-08-05 16:13:43 176

原创 详解拷贝构造函数

基本规则拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量。所以类中可以存在多个拷贝构造函数。编译器会自动生成默认构造函数,这个构造函数很简单,仅仅使用“老对象”的数据成员的值对“新对象”的数据成员逐个进行赋值,也就是浅拷贝。默认拷贝构造函数不处理静态变量。如果静态成员变量在构造、析构实例的时候需要修改,那么通常需要手工实现拷贝构造函数和...

2018-08-04 14:19:41 262

原创 构造函数的成员初始化列表问题

必须在派生类构造函数中初始化的几种情况派生类构造函数对基类初始化基类没有显式声明构造函数或者有一个无参数的构造函数,派生类构造函数可以不用对基类初始化,即忽略基类的构造函数,基类的构造函数全是有参数的,派生类必须至少实现一个基类的构造函数,例如Qt中常见的:explicit MainWindow(QWidget* parent=0);//QMainWindow构造函数都...

2018-08-04 10:12:15 620

原创 构造函数与析构函数

构造函数不能是虚函数。一般会报错inline”是构造函数的唯一合法存储类。类有一个指向虚函数表的指针用于调用虚函数,这个指针是在构造函数里初始化的,如果构造函数是虚函数,怎么在没有初始化的情况下调用它?构造函数中最好不要调用虚函数,某些编译器会报错。因为先运行基类构造函数,再运行派生类的。基类的构造函数时已经出现了虚函数表指针,它指向基类的虚函数表,所以基类的构造函数中调用的虚函数是基类的。E...

2018-08-03 21:27:24 122

原创 C++笔试题(二)

函数指针函数指针本质还是指针,可以用来调用函数和传递参数。声明方式:type (*name)(形参表),另外常常与typedef结合使用。比如这样使用:int fun(int a,int b){ return a+b;}int (*pf)(int) = fun;cout<<pf(3,4)<<endl; // 7使用typedef:ty...

2018-08-03 21:22:26 85

原创 TCP分段与IP分片

链路层的一个作用就是数据成帧,帧包括了head和data,而data有大小限制,就是常说的MTU,对以太网来说是1500字节。data包括了上层的网络层head和传输层head,这两个head共占了40字节,剩下的数据大小不能超过1460字节,也就是MMS。 分段 SegmentMSS是TCP数据包每次能够传输的最大数据分段,TCP报文段的长度大于MSS时,要进行分段传输。TCP协议...

2018-07-30 16:57:45 1302

原创 图解fork函数机制(简单易懂)

fork函数机制十分难以理解,尤其涉及到循环fork时就更难搞清楚,例如: for(i=0; i<3; i++){ pid = fork(); if(pid>0) std::cout<<"pid: "<<getpid()<<endl;

2018-07-29 18:16:00 2232

原创 Qt常用命令和pro参数

Qt常用工具(命令行指令)位于 C:\Qt5.7.1\5.7\msvc2015_64\bin 命令 功能 assistant 帮助文档 designer 设计器 linguist 翻译工具 lupdate 提取翻译字符串和生成ts文件 lrelease 从ts文件生成qm文件 moc Qt Meta Ob...

2018-07-25 12:03:38 724

转载 使用sizeof计算联合体的大小

#include <iostream> using namespace std; union u{ double a ; int b ;};union u2{ char a[13] ; int b ;};union u3{ char a[13] ; char b ;};int main(){ ...

2018-07-25 10:52:13 97

转载 MySQL的逻辑架构

MySQL的逻辑结构图将整个MySQL分成四层,图如下: 1.连接层最上层是一些客户端和连接服务,包含本地scoket同学和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信,主要完成一些类似连接处理,授权认证,及相关的安全方案,在该层引入线程池的概念,为通过认证安全接入的客户端提供线程,同样在该层上可以实现基于SSL的安全链接,服务器也会为安全接入的每个客户端验证它所具备的...

2018-07-22 10:37:39 866

转载 静态绑定和动态绑定

对于非虚成员函数,C++是静态绑定的,而虚函数都是动态绑定,如此才可实现多态性。这也是C++语言和其它语言Java, Python的一个显著区别。几个名词定义: - 静态类型:对象在声明时采用的类型,在编译期既已确定; - 动态类型:通常是指一个指针或引用目前所指对象的类型,表现一个对象将会有什么行为,是在运行期决定的; - 静态绑定:绑定的是静态类型,所对应的函数或属性依赖于对象的静态...

2018-07-21 21:50:05 722

原创 解析Qt元对象系统(五) Q_INVOKABLE与invokeMethod

概述查看Qt源码可知,Q_INVOKABLE是个空宏,目的在于让moc识别。 使用Q_INVOKABLE来修饰成员函数,目的在于被修饰的成员函数能够被元对象系统所唤起。 Q_INVOKABLE与QMetaObject::invokeMethod均由元对象系统唤起。这一机制在Qt C++/QML混合编程,跨线程编程,Qt Service Framework 以及 Qt/ HTML5混合编程以...

2018-07-21 10:55:04 1452

原创 解析Qt元对象系统(四) 属性系统

官方解释我们在Qt源码中可以看到一个QObject的子类经常会用到一些Q_开头的宏,例如QMainWindow类开始部分代码是这样的: Q_PROPERTY(QSize iconSize READ iconSize WRITE setIconSize) Q_PROPERTY(Qt::ToolButtonStyle toolButtonStyle READ toolButt...

2018-07-21 10:54:30 372 1

原创 解析Qt元对象系统(三) 信号与槽

引述我们从普通的点击按钮过程来看一下信号与槽的运行机制。先运行一个普通的QWidget程序,添加一个按钮,定义一个槽函数test,函数体里做个断点,调试运行,可以看到从回调函数qt_internal_proc开始,一直到槽函数。元对象系统的调用层次如下 QAbstractButtonPrivate::click和QAbstractButtonPrivate::emitClicked属于源...

2018-07-21 10:54:02 1032

原创 解析Qt元对象系统(二) Q_OBJECT

Q_OBJECT宏的定义在qobjectdefs.h:#define Q_OBJECT \public: \ QT_WARNING_PUSH \ Q_OBJECT_NO_OVERRIDE_WARNING \ static const QMetaObject staticMetaObject; \ virtual const QMetaObject *met...

2018-07-21 10:53:37 1124

原创 解析Qt元对象系统(一) 概述

Meta-Object System 提供了Qt的信号和槽机制以及对象之间的互相通信,运行时的信息和动态属性系统。三个必要条件: 1. QObject的子类 2. 宏Q_OBJECT 3. Meta Object CompilerQt官方建议对自定义的QObject子类都要加这个宏,但要注意:某些类不是继承自QObject,这些类里加Q_OBJECT就会出错,例如QEvent,QGr...

2018-07-21 10:53:12 1092

原创 解析QDataStream操作QString

sizeof与size,length先看这样的代码: QString s="abcdefg"; qDebug().noquote()<<"sizeof:"<<sizeof(s); // 4 qDebug().noquote()<<"length:"<<s.length(); // 7

2018-07-21 10:51:17 1986

原创 C++笔试题(一)

形参与实参形式参数:定义函数时函数名后括号中的变量名。实际参数:调用函数时函数名后括号中的表达式。 1.形参是变量,未被调用时,不占存储单元,调用过程中占用存储单元。 2.实参可以是常量、变量或者表达式,要与形参类型一致,而且实参要有确定的值,占用储存单元。 3.C++中实参对形参数据传递是单向传递,在存储单元中是不同的单元。 比如:int sum(int a, int b...

2018-07-21 10:48:09 77

原创 MyISAM 和 InnoDB 的区别

对比项 MyISAM InnoDB 主外键 不支持 支持 事务 不支持 支持 锁 表锁,操作一条记录也会锁住整个表,不适合高并发 行锁,操作只锁一行,不影响其他行,适合高并发 缓存 只缓存索引,不缓存数据 缓存索引和数据,对内存要求高 表空间 小 大 关注点 性能 事务关键...

2018-07-19 22:28:02 87

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