11 2016 档案

摘要:一、C++对象模型中nostatic data member被置于每一个class object中,static data member、static function member和nostatic function member都被存放在所有的class object之外。virtual f... 阅读全文
posted @ 2016-11-27 15:31 luizp 阅读(130) 评论(0) 推荐(0)
摘要:一、静态链接缺陷 静态链接需要把数据和代码都连接到自己的可执行文件中,运行时系统中有时会存在多个库文件副本从而容易造成内存和磁盘的空间浪费、其次静态链接模块更新困难。为了解决这两个问题需要把程序的模块分隔开,生成相互独立的文件从而不在将他们链接在一起。对目标文件的链接等到运行时在进行,这就是... 阅读全文
posted @ 2016-11-27 14:29 luizp 阅读(280) 评论(0) 推荐(0)
摘要:一、进程虚拟地址空间 1、程序是一个静态的概念,他是一些预编译好的指令数据集合的一个文件。进程是一个动态的概念是一个程序运行时的过程。​ 每个进程都有自己独立的虚拟地址空间,虚拟地址空间的大小有硬件平台决定,具体说是CPU位数决定的,32位的平台具体大小是0-4G。从程序员的角度来讲可以通... 阅读全文
posted @ 2016-11-27 14:28 luizp 阅读(259) 评论(0) 推荐(0)
摘要:一、在Linux下一个程序的编译过程可分为:预编译、编译、汇编、链接。 1、预编译 gcc -E hello.c -o hello.i 预编译过程注意处理那些源代码文件中的以#开始的预编译指令。比如“#include”“#define”“#ifdef”等。删除注释,​添加行号。 2、编... 阅读全文
posted @ 2016-11-27 14:27 luizp 阅读(227) 评论(0) 推荐(0)
摘要:System V 与Posix 共享内存区 二者的差别是: (1)Posix共享内存区是先调用shm_open然后再调用mmap,System V 共享内存区是先调用shmget再调用shmat。 (2)Posix共享内存区对象的大小可在任何时刻通过ftruncate修改,而System... 阅读全文
posted @ 2016-11-27 14:26 luizp 阅读(225) 评论(0) 推荐(0)
摘要:Posix提供了两种在无亲缘关系进程间共享内存区的方法: (1)内存映射文件:先有open函数打开,然后调用mmap函数把得到的描述符映射到当前进程地址空间中的一个文件(上一篇笔记所用到的就是)。 (2)共享内存区对象:先有shm_open打开一个Posix IPC名字(也可以是文件系统中... 阅读全文
posted @ 2016-11-27 14:25 luizp 阅读(132) 评论(0) 推荐(0)
摘要:一、信号量分类 (1)Posix有名信号量,可用于进程和同一进程不同线程间同步 (2)​Posix基于内存的信号量,存放在共享内存区中,可用于进程和同一进程不同线程间同步 (3)System V信号量​,在内核中维护,可用于进程和同一进程不同线程间同步。 二、信号量、互斥锁、条件变量的... 阅读全文
posted @ 2016-11-27 14:24 luizp 阅读(345) 评论(0) 推荐(0)
摘要:1、互斥锁 互斥锁API pthread_mutex_lock(pthread_mutex_t *mutex); 用此函数加锁时,如果mutex已经被锁住,当前尝试加锁的线程就会阻塞,直到互斥锁被其他线程释放。当此函数返回时,说明互斥锁已经被当前线程成功加锁. pthread_mu... 阅读全文
posted @ 2016-11-27 14:23 luizp 阅读(1129) 评论(0) 推荐(0)
摘要:共享内存是IPC最快的方式。一旦这种方式映射到共享它的进程地址空间,这些进程间的数据传递就不在涉及内核。管道、FIFO、System V消息队列的read、msgrcv、write和msgsnd都涉及从进程与内核的数据复制。 ​共享内存操作函数: 1、系统调用mmap() void... 阅读全文
posted @ 2016-11-27 14:22 luizp 阅读(126) 评论(0) 推荐(0)
摘要:一、Posix消息队列 ​1、mq_open,mq_close,mq_unlink #include mqueue.h> mqd_t mq_open(const char *name, int oflag, ...); oflag:O_RDONLY​,O_WRONLY,O_RDWR,... 阅读全文
posted @ 2016-11-27 14:20 luizp 阅读(278) 评论(0) 推荐(0)
摘要:1、概述 管道:是最初的Unix IPC形式,但是没有名字只能有亲缘关系的进程使用。FIFO有时称为有名管道,可以在任意进程间使用。 2、管道​ #include int pipe(int fd[2]); ​返回值:成功,返回0,否则返回-1。参数数组包含pipe使用的两个文件的描述... 阅读全文
posted @ 2016-11-27 14:18 luizp 阅读(218) 评论(0) 推荐(0)
摘要:一、接口不变就可以不需要重新编译? 对于很多库的实现者可能会有这样的认识“接口不变就可以不需要重新编译”,其实这句话是有前提的,前提是实现的动态库有足够的兼容性和鲁棒性。尤其是C++实现的动态库,C++只对语言层规则做了规定,没有二进制级别的任何规定。 COM本质论里面的例子很好的阐述了这点,简... 阅读全文
posted @ 2016-11-27 12:02 luizp 阅读(1303) 评论(0) 推荐(0)
摘要:1、泛型算法定义 泛型算法:因为它们实现共同的操作,所以称之为“算法”;而“泛型”指的是它们可以操作在多种容器类型上——不但可作用于 vector 或 list 这些标准库类型,还可用在内置数组类型、甚至其他类型的序列上,这些我们将在本章的后续内容中了解。自定义的容器类型只要与标准库兼容,同... 阅读全文
posted @ 2016-11-27 11:37 luizp 阅读(219) 评论(0) 推荐(0)
摘要:1、关联容器定义 关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。 关联容器(Associative containers)支持通过键来高效地查找和读取元素。两个基本的关联容器类型是 map set。map 的... 阅读全文
posted @ 2016-11-27 11:34 luizp 阅读(149) 评论(0) 推荐(0)
摘要:标准库定义了三种顺序容器类型:verctor、list、deque(双端队列) verctor:支持快速随机访问。 list:支持快速插入​删除。 deque:双端队列 1、容器构造函数 容器构造函数 将一个容器复制给另一个容器时类型必须匹配,容器类型和元素类型都必须相同。​... 阅读全文
posted @ 2016-11-27 10:56 luizp 阅读(157) 评论(0) 推荐(0)
摘要:1、谨慎处理Linux信号量和错误号 首先介绍两个很常用网络编程的用法, (1)很多套接字程序中为了防止进程收到SIGPIPE信号时崩溃往往会在进程中设置忽略信号SIGPIPE​。 (2)但是很多程序为了提高send的成功率对send做了二次封装,即对send的返回值进行判断,如果返回-... 阅读全文
posted @ 2016-11-26 17:29 luizp 阅读(405) 评论(0) 推荐(0)
摘要:一、IP分片 物理网络层一般要限制每次发送数据帧的最大长度。任何时候I P层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU。IP把MTU与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。 ​... 阅读全文
posted @ 2016-11-26 17:24 luizp 阅读(615) 评论(0) 推荐(0)
摘要:性能优化主要应该着眼于I/O和内存管理,I/O系统调用通常发生在毫秒级,CPU调用在亚微秒级。 一、散列 1、散列函数一般需要快速工作,需要满足一下条件: (1)最多含有一个除法运算(一般是最后的取摸运算) (2)生成广泛的散列键 (3)不依赖于将促使产生聚集的数据属性 通用的散列函数:Hash... 阅读全文
posted @ 2016-11-26 16:25 luizp 阅读(151) 评论(0) 推荐(0)
摘要:STUN是一个简单的客户端 - 服务器协议。客户端发送一个请求到一台服务器,而服务器返回一个响应。 有两种类型的请求: 绑定请求(通过UDP发送)和共享密钥请求(发送TLS (通过TCP)) 。 共享秘密请求服务器返回一个临时的用户名和密码。此用户名和密码用于在随后的绑定请求和绑定响应,... 阅读全文
posted @ 2016-11-26 16:11 luizp 阅读(2408) 评论(0) 推荐(0)
摘要:(1)完全透明NAT(Full Cone NAT): 从相同内部主机(IN IPX) +端口(IN PORTX)发送的数据映射为相同的IP(OUTIP X)和端口(OUT PORT X)发送到外网。并且从另一个服务器(Y),如果直连到映射的IP(OUT IP X)和端口(OUT PORT X... 阅读全文
posted @ 2016-11-26 16:08 luizp 阅读(456) 评论(0) 推荐(0)
摘要:-rpath dir Add a directory to the runtime library search path. This is used when linking an ELF executable with shared objec... 阅读全文
posted @ 2016-11-26 16:05 luizp 阅读(275) 评论(0) 推荐(0)
摘要:EINTR错误的产生: 当系统阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函数返回时,该系统调用可能返回一个EINTR错误。例如:在socket服务器端,设置了信号捕获机制,有子进程,当在父进程阻塞于慢系统调用时由父进程捕获到了一个有效信号时,内核会致使accept返回一个EIN... 阅读全文
posted @ 2016-11-26 16:01 luizp 阅读(252) 评论(0) 推荐(0)
摘要:RST为“复位”,它是TCP在某些错误情况下所发出的一种TCP分节。 有三个条件可以产生RST: 1), SYN到达某端口但此端口上没有正在监听的服务器。 2), TCP想取消一个已有连接 3), TCP接收了一个根本不存在的连接上的分节。 ... 阅读全文
posted @ 2016-11-26 15:58 luizp 阅读(558) 评论(0) 推荐(0)
摘要:套接字的默认状态均为阻塞,产生阻塞的操作有下面四类 1、读操作 read时对于一个阻塞套接字,如果该套接字的接收缓冲区没有数据可读,则该进程将被投入睡眠,直到有数据到达。对于非阻塞套接字如果接收缓冲区没有数据可读则调用会立即返回一个EWOULDBLOCK错误。 2、写操作 write时对于一个阻... 阅读全文
posted @ 2016-11-26 15:37 luizp 阅读(139) 评论(0) 推荐(0)
摘要:int close(int sockdf); 行为描述:​ 1、close引发描述符的引用计数减一,当该计数为0时才会关闭套接字。 2、close会终止读和写两个方向的数据传送,其行为受SO_LINGER属性影响。 (1)若不设置SO_LINGER属性或者关闭SO_LINGER属性其默... 阅读全文
posted @ 2016-11-26 14:52 luizp 阅读(258) 评论(0) 推荐(0)
摘要:Linux编程中往往程序会莫名其妙的在write,send等地方退出,如果有这种问题需要注意是不是信号量引起的。 网络编程中可以有选择性的使用signal函数处理某些信号,下面介绍几个常用的信号。​ 1、SIGPIPE 产生原因: TCP的"四次分手"关闭. TCP是全双工的信道, 可... 阅读全文
posted @ 2016-11-26 14:44 luizp 阅读(261) 评论(0) 推荐(0)
摘要:TCP状态转换分服务端和客户端两部分: 一、服务端状态变迁:​ 服务端​创建套接字之后调用listen函数将套接字有一个未连接的主动套接字转换为被动套接字,指示内核应接受指向该套接字的连接请求,套接字状态由CLOSE转换为LISTEN,等待客户端连接。所以服务端是被动接收连接的,服务... 阅读全文
posted @ 2016-11-26 14:41 luizp 阅读(312) 评论(0) 推荐(0)
摘要:1、exit函数和return函数的主要区别是: 1)exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭... 阅读全文
posted @ 2016-11-25 18:59 luizp 阅读(280) 评论(0) 推荐(0)
摘要:Linux字符界面切换到图形界面由字符界面切换到图形界面可用两种简单方法实现:1、在字符界面输入startx或init 5 。2、通过编辑/etc/inittab文件实现默认进入图形界面。把其中的id:3:initdefault中的3改为5,这样以后系统启动后将直接进入文本模式。以下是配置引... 阅读全文
posted @ 2016-11-25 18:59 luizp 阅读(636) 评论(0) 推荐(0)
摘要:一、程序内存分配 栈:用于维护函数调用的上下文; 堆:容纳应用程序动态分配的内存区域。 如下图Linux进程地址空间分布 Linux下有一个动态链接库映射区用于动态链接库的加载映射,Linux下从0X40000000地址开始分配此区域的空间。 二、调用惯例 调用惯例一般指如下几个方面: 1、... 阅读全文
posted @ 2016-11-20 15:27 luizp 阅读(142) 评论(0) 推荐(0)
摘要:一、导入导出符号 ELF中默认导出所有的全局符号,Windows中需要使用“__deslcpec(dllexport)”修饰某个函数或者变量表示导出该函数或者变量,“__deslcpec(dllimport)”表示导入该函数或者变量。也可以使用.def文件来声明导入导出符号。 二、运行时链接 W... 阅读全文
posted @ 2016-11-13 14:57 luizp 阅读(403) 评论(0) 推荐(0)
摘要:一、“--export-dynamic”参数的使用 GCC编译可执行文件时可以使用-Wl,--export-dynamic参数,此时链接器产生可执行文件时会将所有全局符号导出到动态符号表。 gcc -Wl,--export-dynamic -o p1 p1.c -L. -l0 如果在创建动态链... 阅读全文
posted @ 2016-11-13 13:35 luizp 阅读(2164) 评论(0) 推荐(0)
摘要:一、core分析 1、查看命令: ulimit -c 启动命令: ulimit -c ulimited 查看core文件: gdb -c core.xxx a.out 2、生成core文件的路径在文件/etc/sysctl.conf中 cat /etc/sysctl.conf sysctl.... 阅读全文
posted @ 2016-11-12 13:55 luizp 阅读(313) 评论(0) 推荐(0)
摘要:1、概述 文件是I/O设备的抽象表示,虚拟存储​器是对主存和磁盘I/O设备的抽象表示,进程则是对存储器、主存和I/O设备的抽象表示。 2、​C语言static 在C语言中,C源文件扮演模块的角色,任何声明带有static属性的全局变量或者函数都是私有的,类似于C++中的private,只... 阅读全文
posted @ 2016-11-12 13:48 luizp 阅读(144) 评论(0) 推荐(0)