- 博客(47)
- 资源 (1)
- 收藏
- 关注
原创 两个整数集合A和B,求其交集
两个整数集合A和B,求其交集。 1. 读取整数集合A中的整数,将读到的整数插入到map中,并将对应的值设为1。 2. 读取整数集合B中的整数,如果该整数在map中并且值为1,则将此数加入到交集当中,并将在map中的对应值改为2 通过更改map中的值,避免了将同样的值输出两次。下面为源码:#include #include using namespace std;
2013-08-28 22:15:00 9562
原创 UNIX网络编程--设置I/O超时
1. 调用alarm,它在指定超时期满时产生SIGALRM信号。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用2. 在select中阻塞等待I/O(select有内置的时间限制),以此代替直接阻塞在read或write调用上3. 使用较新的SO_RCVTIMEO和SO_SNDTIMEO套节口选项。
2013-08-28 15:29:31 1182
原创 UNIX网络编程--实现并发UDP服务器
大多数UDP服务器程序是迭代运行的,即服务器等待一个客户请求,读入这个请求,处理这个请求,送回其应答,接着等待下一个客户请求。然而当客户请求的处理需消耗用过长时间时,我们就得设计一个并发的UDP服务器。以下为实现的方法: 1. 该方法比较简单,读入一个客户请求并发送一个应答后,与这个客户就不再相关了。这种情形下,读入客户请求的服务器可以fork一个子进程并让子进程去处理该请求。该“请求”(
2013-08-27 21:06:11 1369
原创 UNIX网络编程--套接字可读或可写的条件
socket可读的条件 1. socket的接收缓冲区中的数据字节大于等于该socket的接收缓冲区低水位标记的当前大小。对这样的socket的读操作将不阻塞并返回一个大于0的值(也就是返回准备好读入的数据)。我们可以用SO_RCVLOWATsocket选项来设置该socket的低水位标记。对于TCP和UDPsocket而言,其缺省值为1 2. 该连接的读这一半关闭(也就是接收了FIN的T
2013-08-27 20:43:12 2099
原创 UNIX网络编程--TIME_WAIT
先看以下TIME_WAIT状态是怎么产生的,最好的解释就是看TCP状态转换图咯对与每个状态的解释如下1、建立连接协议(三次握手)(1)客户端发送一个TCP segment(Seq 由主机产生,假设为x, SYN=1)到服务器。这是三次握手过程中的segment 1。(2) 服务器端回应客户端的,这是三次握手中的第2次握手,此时发送2个segment,第一个seg
2013-08-26 19:48:56 1387
原创 linux命令--sysctl
sysctl sysctl被用来在执行时配置内核参数。这些参数都存储在/proc/sys/(以键-值对形式存储)中。你可以用sysctl来读和写数据命令参数 variable 要读的键值的名字 eg:sysctl net -> 打印出有关网络的配置参数其 -n variable 只打印值,不打印键的名字 -e variable 打印时忽略错误的键-N var
2013-08-25 22:16:07 2547
原创 UNIX 网络编程之线程
概述: 实现并发服务器一般都是父进程accept一个连接,然后fork一个子进程,该子进程处理与该连接对端的客户之间的通信。但是fork是昂贵,耗资源和时间。而线程是轻量级线程,它的创建比进程的创建块10-100倍。在同一进程内除了共享全局变量外还共享: 大多数数据;进程指令; 打开的文件; 信号处理函数信号处置; 当前工作目录;用户ID和组ID不过每个线程有各自的资源:‘ 线
2013-08-25 19:58:46 1077
原创 C++中delete, new以及new [], delete[]操作符内幕
人们有时好像喜欢故意使C++语言的术语难以理解。比如说new操作符(new operator)和operator new的区别。 当你写这样的代码:string *ps = new string("Memory Management"); 你使用的new是new操作符。这个操作符就象sizeof一样是语言内置的,你不能改变它的含义,它的功能
2013-08-25 14:39:13 668
转载 释放对象数组:delete与delete[]
>练习 14.11 中提到: Account *parray=new Account[100]; delete parray; delete [] parray; 方括号的存在会使编译器获取数组大小(size)然后析构函数再被依次应用在每个元素上,一共size次。否则,只有一个元素被析构。 无论哪种情况,分配的全部空间被返还给自由存储区。 我
2013-08-25 14:37:59 2037
转载 C++中cin函数深入分析
很多初学者都认为cin函数是一个很简单的函数,其实不然!cin函数有很多需要了解的知识(比如:cin的返回值是什么,cin提供了哪些成员函数且分别是什么作用,如cin.clear(), cin.ignore(), cin.fail(), cin.good()等等),如果没有很好的掌握,在使用的时候很可能会出问题却不知其原因!而且很多人也确确实实遇到过不少问题,以下是几个简单的例子:程序1:
2013-08-25 11:43:52 1627
原创 网络编程--套接字选项
基本套接字选项1. SO_BROADCAST 开启或禁止进程发送广播消息的能力。2. SO_DEBUG 开启该选项后,内核将为TCP在该套接字发送和接收的所有分组保留详细跟踪信息。这些信息保存在内核的某个环型 缓冲区中3. SO_KEEPALIVE 如果两小时内在该套接字的任一方向上都没有数据交换,TCP就自动给对端发送一个保持存活探测分节,它导致以
2013-08-25 09:05:25 1461
转载 标准I/O的缓冲机制的实例讲解
标准I/O库对每个I/O流自动进行缓冲,从而避免了应用程序为了减少read和write系统调用而设置合适的缓冲区长度。标准I/O提供了三种类型的缓冲我们下来看一个《unix环境高级编程》上的一个输出标准输入,标准输出,标准出错和普通文件的缓冲信息的例子 4 void pr_stdio(char *,FILE *); 5 6 int main(void){
2013-08-23 22:54:13 1019
原创 linux进程间通信--信号量
概述 信号量是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。下图表示的是由两个进程使用的一个二值信号量一个进程可以在信号量执行三种操作: 1. 创建(create)一个信号量,这要求调用者指定初始值,对于二值信号量来说,它通常是1, 2. 等待(wait)一个信号量,该操作会测试这个信号量的值,如果其值小于或等于0,那就等待or阻塞,一旦其值变为大于1
2013-08-23 18:06:53 1238
转载 C++中const的实现机制深入分析
问题 C语言以及C++语言中的const究竟表示什么?其具体的实现机制又是如何实现的呢? 本文将对这两个问题进行一些分析,简单解释const的含义以及实现机制。 问题分析 简单的说const在C语言中表示只读的变量,而在C++语言中表示常量。关于const在C与C++语言中的使用以及更多的区别,以后有时间另开一贴说明。那么const究竟是如何实现的呢? 对于声明为const
2013-08-23 10:24:35 939
原创 使用互斥锁解决生产者与消费者问题
互斥锁:上锁与解锁互斥锁指代相互排斥,是最基本的同步形式,它可用于保护临界取,以保证任何时刻只有一个线程在执行其中的代码。它实际上保护的是临界区中被操纵的数据,也就是保护由多个线程或多个进程分享的共享数据使用方法lock_the_mutex(...)临界区unlock_the_mutex(,,,)在Posix中,互斥锁声明为具有pthread_mutex_t数据类型
2013-08-23 09:44:53 2050
转载 Ubuntu下星际译王/字典的安装实例解
Ubuntu下安装星际译王/字典abc@abc:~$ sudo apt-get install stardict正在读取软件包列表... 完成正在分析软件包的依赖关系树 读取状态信息... 完成 正在初始化软件包状态... 完成创建标签数据库... 完成 下列新软件包将被自动安装:stardict-common 下列“新”软件包将被安装。stardict s
2013-08-23 08:27:22 925
转载 虚函数详解
C++ 虚函数表解析前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议
2013-08-23 01:42:18 2062
转载 C++的类型转换符
使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。 1 static_cast用法:static_cast ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:①用于类层次结构中基类和子类之
2013-08-22 23:41:01 691
转载 编译linux内核
内核编译实验环境:Ubuntu 10.04 内核版本 2.6.32-36-generic过程概述:下载源码:下载链接:http://www.kernel.org/pub/linux/kernel/v2.6/配置内核:make menuconfig编译内核:make bzImage编译内核模块:make modules安装内核模
2013-08-22 23:01:28 930
转载 epoll使用详解
epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且
2013-08-22 22:20:29 1104 1
原创 用O(nlog(n)实现最长递增子序列问题
问题描述 输入一串数字,或数组,如-5, 1, -3, -1, -2, 1, 4, 8, 9, 7,则该数组的最长递增子序列之一(注意,最长递增子序列有时候不止一个)为-5,-3, -1, 1, 4, 8, 9解决方案: 有两种思路:1. 用动态规划来解决(O(n^2)));2,用类似二分排序的方法来解决(O(nlog(n)))思路一:可以参考之前的博文最长递增子序列的求解
2013-08-22 16:04:08 1183
原创 select.poll,epoll的区别与应用
先讲讲同步I/O的五大模型阻塞式I/O, 非阻塞式I/O, I/O复用,信号驱动I/O(SIGIO),异步I/O模型而select/poll/epoll属于I/O复用模型 select函数 该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经历一段指定的时间后才能唤醒它#include #include int select(int
2013-08-22 11:46:43 1170
转载 Linux环境安装ACE 6.1.0
下载下载地址:http://download.dre.vanderbilt.edu/下载ACE-6.1.0.tar.bz2,这个软件包只包含ACE,不包含TAO等附加的东西,另外bz2压缩格式的源码包比较小,只有7.55M。解压mkdir ace-installtar jxf ACE-6.1.0.tar.bz2 -C ace-install配置
2013-08-21 23:35:14 980
原创 linux中close与shutdown的区别
1. close 把描述符的引用计数减一,仅在该计数变为0时才关闭套接字。而shutdown可以并以不管引用计数就激发TCP的正常连接终止序列2. close终止读和写两个方向的数据传送,而shutdown可以指定哪个方向被关闭,读端还是写端还是两个都关闭int shutdown(int sockfd, int howto);howto参数的值SHUT_RD 只关闭读这一半
2013-08-21 22:52:12 1226
转载 每个开发人员必须知道8个linux命令
我们以一些文本举例。假设我们有2个文件,里面有订单关于第三方的放置地点和发送回应。cat order.out.log8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.998:23:45 112, 1, Joy of Clojure, Hardcover, 29.998:24:19 11
2013-08-20 14:58:05 693
原创 linux命令--netstat
netstat命令 netstat,用来打印网络上的连接,路由表,接口信息,伪连接和多播成员信息用法摘要netstat -t | -u | -w | -l | -a | -n | -o | -p | - N | -h 等 详解 netstat打印出linux'下网络子系统的信息。信息类型由给定的第一个参数控制 1. (none) 在无参数的情况下,ne
2013-08-20 01:28:35 979
原创 卡塔兰数的应用
卡塔兰数卡塔兰数的一般項公式為 前幾項為 (OEIS中的数列A000108): 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 2446
2013-08-19 23:20:08 2030
原创 linux虚存管理机制
Linux的内存管理采用页式管理,使用多级页表,动态地址转换机构与主存、辅存共同实现虚拟内存:每个用户进程拥有4GB的虚拟地址空间,进程在运行过程中可以动态浮动和扩展,为用户提供了透明的、灵活有效的内存使用方式,下面简述Linux虚存管理以基本特点和主要实现技术:一、 Linux虚存管理的基本特点 1. 更大的地址空间。 虚拟内存可以是系统实际拥有的物理内存的若干倍。因而它使得操作
2013-08-19 21:10:00 2727
转载 有向图的遍历算法
有向图基本算法 -- 遍历算法1. 图的表示2. 有向图的遍历算法:深度优先3. 有向图的遍历算法:广度优先4 代码反思5. 下载 1. 图的表示 1.1 图的定义图G定义为V和E的集合G={V, E},其中V表示图中的所有的顶点集合,E表示的是G中的所有的边的集合。图按照E中的元素是否有方向,分为有向图和无向图。 1.
2013-08-19 20:43:55 2778
原创 linux内存管理机制
物理内存和虚拟内存 我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,
2013-08-19 17:05:27 887
原创 二叉搜索树的详解(算法导论读书笔记)
什么是二叉搜索树?一棵二叉树的节点x,如果y是x左子树中的一个节点,那么y.keyx.key二叉树的数据结构typedef int data_t;typedef struct BST{ data_t data; struct BST *left; struct BST *right; struct BST *parent;}BST;二叉搜索树的遍历我们可以通过
2013-08-18 10:30:47 1308
原创 volatile详解
1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变量缓
2013-08-18 02:40:49 984
原创 守护进程的详解与创建
守护进程守护进程是一种后台运行并且独立于所有终端控制之外的进程。为什么需要有独立于终端之外的进程呢?首先,处于安全性的考虑我们不希望这些进程在执行中的信息在任何一个终端上显示。其次,我们也不希望这些进程被终端所产生的中断信号所打断。最后,虽然我们可以通过&将程序转为后台执行,我们有时也会需要程序能够自动将其转入后台执行。因此,我们需要守护进程。守护进程的启动要启动一个守护进程,
2013-08-18 00:20:53 1374
翻译 linux命令--tcpdump
tcpdump命令英文原意是dump traffic on a network ,即截获网络上的数据报,可以根据指定的网络接口来截获不同的数据报。它会输出在某个网络接口上符合匹配表达式的报内容的描述。当tcpdump完成抓包后,会打印出类似下面的内容: 9 packets captured56 packets received by filter17 packets dropped
2013-08-17 20:25:26 1590
原创 linux命令--ipcs, ipcrm
ipcs命令是linux/uinx上提供关于一些进程间通信方式的信息,包括共享内存,消息队列,信号ipcs用法ipcs -a 是默认的输出信息 打印出当前系统中所有的进程间通信方式的信息ipcs -m 打印出使用共享内存进行进程间通信的信息ipcs -q 打印出使用消息队列进行进程间通信的信息ipcs 0s 打印出使用信号进行进程间通信的信息输出格式的
2013-08-16 00:08:22 6392
原创 最长递增子序列的求解--动态规划求解
动态规划的基本思想(百度百科) 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治
2013-08-15 21:56:56 1467
原创 vim的一些命令
1. i --insert模式,按ESC回到Normal模式2. x 删处当前光标所在的一个字符3. :wq 存盘+退出 4. dd 删除当前行,并把删除的行存到剪贴板里5. p 粘帖剪贴板6. !q 不存盘直接退出7. hjkl 相当与←↓↑→键8. :help 显示相关命令的帮助9. a 在光标后插入10. o 在当前行后插入一个新行11. c
2013-08-13 23:54:35 1282
原创 栈的push、pop序列
题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,
2013-08-12 22:31:54 1796
原创 系统调用与标准库调用的区别
1、系统调用和库函数的关系 系统调用通过软中断int 0x80从用户态进入内核态。 函数库中的某些函数调用了系统调用。 函数库中的函数可以没有调用系统调用,也可以调用多个系统调用。 编程人员可以通过函数库调用系统调用。 高级编程也可以直接采用int 0x80进入系统调用,而不必通过函数库作为中介。 如果是在核心编程,也可以通过int 0x80进入系统调用,此时不能使用函数库。因为函数库
2013-08-09 21:50:54 1159
转载 netstat命令详解
简介Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。输出信息含义执行netstat后,其输出结果为Active Internet connections (w/o servers)Proto Rec
2013-08-08 22:25:23 770
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人