自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Simon的博客

专注于互联网后台架构开发

  • 博客(62)
  • 收藏
  • 关注

原创 聊聊exit()、_exit()、atexit()的区别

一句话总结:exit()函数在调用exit系统之前把文件缓冲区的内容写回文件;用_exit()函数直接将进程关闭,缓冲区的数据将会丢失;atexit则是main结束后调用处理函数。exit - cause normal process termination.   void exit(intstatus);_exit, _Exit - terminate the calli

2017-10-31 12:40:41 344

原创 linux任务调度机制

一句话总结:

2017-10-30 13:07:02 1294

原创 系统如何将一个信号通知到进程

一句话总结:

2017-10-30 13:05:16 1293

原创 String类的简单实现

一句话总结:注意C++string与C中的字符数组的区别

2017-10-30 13:03:11 392

原创 写个程序判断系统是多少位,是大端还是小端

一句话总结:位数用指针判断,大小端用union(联合体、共用体)。#include int main(){ int a = 0x12345678; printf("Os is %ld\n", sizeof(int*)); printf("a's size is %ld\n", sizeof(a)); printf("int is %ld\n", sizeof(int)); pri

2017-10-29 21:20:32 505

原创 进程地址空间分布和可执行文件分布

进程地址空间分布和可执行文件分布: 转载于:http://www.cnblogs.com/gtarcoder/p/6006023.html进程地址空间    操作系统在管理内存时,每个进程都有一个独立的进程地址空间,进程地址空间的地址为虚拟地址,对于32位操作系统,该虚拟地址空间为2^32=4GB。 进程在执行的时候,看到和使用的内存地址都是虚拟地址,而操作

2017-10-29 21:02:59 595

原创 聊聊Linux下的静态库与动态库的生成与使用

一句话总结:静态库在链接阶段集成于程序中,程序生成可删除;动态库在程序运行时在/usr/lib/目录下查找调用,删除后错误,编译链接均需加上-fPIC。实验代码fun.h#ifndef _FUN_H_#define _FUN_H_#define ver 2.0void print();#endiffun.cpp#include #include "fun.h"using

2017-10-29 20:21:48 326

原创 Linux常用调试命令

一句话总结:收集常用的实战命令1、网络相关netstat: 显示各种网络相关信息,如网络连接(无参数),路由表(-r),接口状态 (Interface Statistics)(-i),masquerade 连接(无效连接)(-m),多播成员 (Multicast Memberships)。tcpdump:用于抓取tcp的包,包括数据头和数据内容ipcs(inter-process

2017-10-29 16:38:19 530

原创 聊聊netstat命令

netstat: 显示各种网络相关信息,如网络连接(无参数),路由表(-r),接口状态 (Interface Statistics)(-i),masquerade 连接(无效连接)(-m),多播成员 (Multicast Memberships).netstat  - Print network connections, routing tables, interface statis

2017-10-29 14:56:39 818

原创 二叉树的层次遍历

一句话总结:用队列,先进先出。

2017-10-26 23:51:00 239

原创 聊下类的浅拷贝问题

一句话总结:防止浅拷贝释放指针所造成的异常问题。#include class A{ int i;};class B{ A *p;public: B() { printf("construct B\n"); p=new A; } ~B() { printf("destruct B\n");

2017-10-26 20:14:16 209

原创 聊下汇总网段

ip地址10.1.8.0/24和10.1.9.0/24,汇总网段是?从第一位不同的开始往后全为0;后面位相同的前缀位的位数 10.1.8.0/24 == 10.1. 0000 100 0 .0/2410.1.9.0/24 == 10.1. 0000 100 1 .0/24从不同的位开始,替换为0,得                         10.1. 0

2017-10-26 20:05:55 1904

原创 看一个多态的题目

一句话总结:注意实例生成过程,注意多态的调用。#include struct A{ void foo(){printf("foo\n");} virtual void bar(){printf("bar\n");} A(){bar();}};struct B:A{ void foo(){printf("b_foo\n");} void bar(){printf("b

2017-10-26 20:02:26 266

原创 聊聊数组指针

一句话总结:注意指针根据指向类型不同是有步长的,如指向结构体指针步长是一个结构体大小。a是个int指针,步长是一个int大小,&a则是数组的地址,步长是数组大小。#include int main(){ int a[5]={1,2,3,4,5}; int *p=(int *)(&a+1); printf("%d\n",*(p-1)); //结果是5 return

2017-10-26 19:57:06 192

原创 聊聊指针常量和常量指针

一句话总结:看const修饰谁,修饰的对象不能变。#include using namespace std;int main(int argc, char const *argv[]){ int i = 10; int j = 10; const int *p1; int const *p2 = &i; p2 = &j; int * const p3 = &i; *p3 =

2017-10-26 19:36:36 240

原创 聊聊排列组合

假设有A、a、B、b、C、c六个元素,每个大小写元素不能相邻,求有多少种排列。第一个位置有6种可能(假设为A),第二个位置有4种(假设为B);第三个位置如果为a,那么只能2种排列,ABaCbc和ABacbC;第三个位置如果不为a(假设为C),有2种可能C和c,第四个位置有两种可能a和b(假设为a),第5个位置也有两种可能b和c,第6个位置只有一种可能。排列总数=6*4*2

2017-10-26 19:23:55 300

原创 聊聊效率较高的几种常用排序算法

1、快速排序:主要思想是找个基准,将数据分成两半,不断迭代排序。注意所有元素都比基准大、或者都比基准小的情况。#include using namespace std;void quickSort(int *a, int left, int right){ if(left >= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/ {

2017-10-26 00:33:47 6018

原创 聊聊TCP超时

一句话总结:防止阻塞在那里,任务该往下走的时候还要往下走。1、接收超时,等待N秒,还是没有消息,那就接着往下走服务端#include #include #include #include #include #include #include using namespace std;int main(){ struct sockaddr_in serAddr; i

2017-10-25 22:01:30 652

原创 获取文件大小的几种方式

1、通过文件C标准课fseek、fell获得,间接获得,速度慢#include #include int main(int argc, char* argv[]) { FILE* fp; long size; fp = fopen("/Users/zhaojunyan/server.cpp", "rb"); if(fp == NULL) {

2017-10-25 19:07:14 4936

原创 聊聊服务端异常终止的问题

一句话总结:服务端还有消息没有接受异常终止则发送RST给客户端,客户端再发送消息则失败;服务端:#include #include #include #include #include #include #include using namespace std;int main(){ struct sockaddr_in serAddr; int liste

2017-10-25 15:52:29 1550

原创 聊聊ctrl+c和ctrl+z的区别

一句话总结:ctrl+c是强制中断程序,ctrl+c是暂停程序。Ctrl+CCtrl+ZCtrl+Dbgfgjobs强制中断程序,进程终止暂停程序,挂起退出shell将一个在后台暂停的命令,变成继续执行将后台中的命令调至前台继续运行查看

2017-10-25 15:15:41 1730

原创 聊聊MSS与MTU

一句话总结:MTU由硬件决定,MTU=MSS+IPV4头+TCP头。MTU:maximum transmission unit,最大传输单元,由硬件规定,如以太网的MTU为1500字节。MSS:maximum segment size,最大分节大小,为TCP数据包每次传输的最大数据分段大小,最大1460字节。MSS值为MTU值减去IPv4 Header(至少20 Byte)和TCP hea

2017-10-25 14:32:41 672

原创 连接一个没有监听的端口结果会怎样

一句话总结:消息可达的情况下服务端直接抛个RST过来服务端:#include #include #include #include #include #include #include using namespace std;int main(){ struct sockaddr_in serAddr; int listenSock, cnntSock;

2017-10-25 14:28:41 3988

原创 TCP粘包

一句话总结:通过自定义协议判断每个包的大小来避免粘包。先看个简单的:服务端:#include #include #include #include #include #include #include using namespace std;int main(){ struct sockaddr_in serAddr; int listenSock, cnntS

2017-10-25 11:54:01 222

原创 聊聊Linux fork多进程并发服务器模型

一句话总结:主进程负责监听,子进程负责处理事务;注意父子进程共享socket句柄,关闭进程不用的句柄,避免句柄泄露;注意给子进程收尸,避免僵尸进程。有点晚了,就简单上个模型吧//子进程善后void sigChildFun(int sigNO) { pid_t pid; int stat; while((pid = waitpid(-1, &stat

2017-10-25 00:13:32 745

原创 聊聊SIGCHLD信号的作用

一句话总结:子进程终止或者停止时,将SIGCHLD信号发送给其父进程,按系统默认将忽略此信号,如果父进程希望被告知其子系统的这种状态,则应捕捉此信号。看下如何捕捉#include #include #include #include #include void sigFun(int sig){ printf("sigFun begin\n"); pid_t pid;

2017-10-24 23:58:45 1486

原创 聊聊wait和waitpid

一句话总结:wait来自于waitpid的简单封装,waitpid更灵活,可等待同组或其他组进程,可设置不阻塞。详细介绍man一下1、先上个wait例子看下#include #include //wait#include //wait#include //fork sleep #include //exitvoid main(){ pid_t pid1,p

2017-10-24 22:38:39 464

原创 makefile的写法

一句话总结:熟悉常用的技巧。直接上实例zjy@ubuntu:~/makefile$ lsfun  main.cpp  makefilezjy@ubuntu:~/makefile$ ls fun/fun.cpp  fun.hzjy@ubuntu:~/makefile$ make--------DEPS=main.d fun/fun.d-

2017-10-24 12:59:53 658

原创 list、vector、map容器erase的区别

一句话总结:list、vector返回的迭代器,map返回空(C++98标准);注意迭代器不要越界。map是从模板类继承来的,不同的C++版本标准其erase函数也不同:C++98C++11void erase (iterator position);iterator erase (const_iterator positio

2017-10-23 19:12:11 1380

原创 使用STL map应该注意什么

一句话总结:map的底层实现基于红黑树,是排好序的,key应该能够做比较才行。如果是结构体怎么办,为了能够比较,那就只能以一个变量作为比较元素,需重载操作符重载可选,但只重载>操作符不行。#include #include #include using namespace std; struct StudentGrade { string

2017-10-23 18:47:37 394

原创 指针操作时当*碰到++

直接上代码吧,先说*p++,*于++优先级相同,但此处采取的是右结合方式,先执行p++,返回p,此时结果为h;++p类同。顺便加一句,容器中直接把迭代器it擦掉是会异常的,如下所示,可以换成m.erase(it++) for(it = m.begin(); it != m.end(); it++) { if(0 == it->second % n)

2017-10-23 18:31:20 200

原创 构造函数为何是唯一一个不能为虚的函数

一句话总结:有虚函数的类需要加上一个虚指针vptr,vptr需存在于对象当中,对象实例化需要构造函数。

2017-10-23 18:23:01 294

原创 static修饰的函数只能在本文件中调用,其他文件想调用怎么办?

一句话总结:static修饰的变量和函数是有可见范围的,一般情况下不要越限处理。利用可在本文件调用的属性,另加一个函数fun,fun调用该static函数;其他文件调用fun即可。

2017-10-23 18:19:42 10583 2

原创 C++中的#和##是干嘛用的

一句话总结:#是连接字符串的,##是粘合成一个名字的。#include using namespace std; #define F(x, y) x##y #define F2(x) cout //注意字符串是要加引号的int main() { int len = 0; F(l, en) = 1; //相当于将len重新赋值了

2017-10-23 18:15:07 3373

原创 delete都做了什么

一句话总结:仅仅是释放了指针指向的那块内存,该内存可以被再次利用,此时指针delete后一定要指向null。#include using namespace std; int main() { int *p = new int; cout << "random value of *p: " <<*p << endl; *p

2017-10-23 18:05:33 383

原创 stringstream——超方便的类型转化

一句话总结:用前记得clear,直接替代atoi/itoa。#include #include #include int main(int argc, char const *argv[]){ std::string str = "76453933445885"; long i = 0; std::stringstream ss; ss << str; ss >>

2017-10-23 17:49:58 345

原创 SOCKET中send和recv函数真正在做什么

一句话总结:send和recv仅仅是在内核空间和用户空间之间拷贝数据,而发送数据是协议的事情。send:将数据拷贝到内核发送缓冲区,拷贝成功返回拷贝的字节数。如果协议正在发送缓冲区的数据,则等待;如果缓冲区剩余空间不足,则等待。recv:将数据用内核接收缓冲区拷贝到用户空间,拷贝成功返回拷贝的字节数。如果协议正在接收数据,则等待;如果接收缓冲区没有数据,则等待。send发送一次数据,r

2017-10-23 12:51:53 986

原创 C++中字符串string的输出,很有意思

一句话总结:区分C与C++的字符串输出机制。C语言是碰到'\0'就结束输出,而C++是根据字符串长度输出的。直接上例子吧#include #include using namespace std; int main() { char szTest[] = {'a', 'b', 'c', '\0', 'd', 'e', 'f'}; strin

2017-10-23 12:46:05 4176

原创 TCP流量控制和拥塞控制

一句话总结:通过滑动窗口进行流量控制,接收端根据自己资源情况改变发送端的窗口上限,即是改变滑动窗口的大小;拥塞控制通过慢启动和拥塞避免,以及快速重传和快速恢复来实现,慢启动以指数不断增大拥塞窗口大小,到达或超过慢开始阈值ssthresh,拥塞窗口cwnd执行拥塞避免转为线性增长,发生超时后,ssthresh=swnd/2,cwnd=1;快速重传为提高效率不再等待超时后重发,而是当接收方

2017-10-22 15:45:00 405

原创 tcpdump抓包实例

一句话总结:熟练使用常用的参数,不满足就去man下,加上分析工具wireshark/fiddler如虎添翼。无聊的tcp/ip协议结合实战会变得有趣。常用:sudo tcpdump -iany port 1234 -Xnlps0sudo tcpdump -iany port 1234 -xnlps0sudo tcpdump -iany port 1234 -Anlps0sudo

2017-10-22 15:38:05 981

空空如也

空空如也

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

TA关注的人

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