摘要: protected 和 private修饰的构造函数:连接 1. 在类的外部创建对象时,不能调用protected或private修饰的构造函数。 2.当子类中的构造函数调用父类的private构造函数时会错,当子类中的构造函数调用父类中的 public或protected构造函数时是对的 1 #i 阅读全文
posted @ 2019-03-12 17:18 苏格拉底的落泪 阅读(349) 评论(0) 推荐(0) 编辑
摘要: 方法一:48 ms 1 /* 2 sumUp递归子程序求解以root为根节点的子节点之和为sum的路径数目; 3 pathSum递归部分是把根节点逐一考察,如以root->left,以root->right为根等等, 4 用sumUp求解其对应的路径数目。最终结果是全部求和,也就是pathSum r 阅读全文
posted @ 2019-02-20 16:04 苏格拉底的落泪 阅读(346) 评论(0) 推荐(0) 编辑
摘要: epoll概念 epoll对文件描述符的操作方式有两种工作模式:LT模式(Level Trigger,水平触发) 和ET模式(Edge Trigger,边缘触发)。 LT模式:当epoll_wait检测到其上有事件发生并将此事件通知应用程序后,应用程序可以不立即处理该事件,这样,当应用程序下一次调用 阅读全文
posted @ 2019-01-25 16:55 苏格拉底的落泪 阅读(256) 评论(0) 推荐(1) 编辑
摘要: poll函数 1. poll函数原型: 分析: 1. nfds:监控数组中有多少文件描述符需要被监控 2. timeout:毫秒级等待 -1 :阻塞等,#define INFTIM -1 Linux中没有定义此宏 0 :立即返回,不阻塞进程 > 0:等待指定毫秒数,如当前系统时间精度不够毫秒,向上取 阅读全文
posted @ 2019-01-23 22:10 苏格拉底的落泪 阅读(482) 评论(0) 推荐(0) 编辑
摘要: 实验一 代码:链接【01项目】 1. 先启动服务器,如图: 2. 然后启动客户端,如图: 3. 输出结果: 【注意】:在服务器终止时,给父进程发送了一个SIGCHILD信号,这一点本例发生了,但是我们没有在代码中捕捉该信号,而默认该信号时被忽略,既然父进程未加处理,子进程于是进入僵尸状态。 如图: 阅读全文
posted @ 2019-01-23 18:40 苏格拉底的落泪 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 文件IO #include<unistd.h> ssize_t read(int fd, void *buf, size_t count); read返回值: 1. = 0:数据读完(读到文件、管道、socket末尾-对端关闭) 2. -1: errno == EINTR:被信号中断 errno = 阅读全文
posted @ 2019-01-23 13:50 苏格拉底的落泪 阅读(100) 评论(0) 推荐(0) 编辑
摘要: 例子:编译、链接examples中的echo。 编译: g++ -c -I ~/build/release-install-cpp11/include echo.cc -std=c++11 g++ -c -I ~/build/release-install-cpp11/include main.cc 阅读全文
posted @ 2019-01-16 14:25 苏格拉底的落泪 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 进程程序替换 进程程序替换原理 fork创建子进程执行的是和父进程相同的程序(也有可能是某个分支),通常fork出的子进程是为了完成父进程所分配的任务,所以子进程通常会调用一种exec函数(六种中的任何一种)来执行另一个任务。当进程调用exec函数时,当前用户空间的代码和数据会被新程序所替换,该进程 阅读全文
posted @ 2019-01-14 21:37 苏格拉底的落泪 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 函数sigsuspend sigqueue函数原型: 函数作用:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用 int sigqueue(pid_t pid, int signo, const union sigval value); 分析: 第 阅读全文
posted @ 2019-01-14 20:37 苏格拉底的落泪 阅读(371) 评论(0) 推荐(0) 编辑
摘要: 函数函数sigaction 1. 函数sigaction原型: int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 分析: 参数 signum :要捕获的信号。 参数act:truct s 阅读全文
posted @ 2019-01-14 10:47 苏格拉底的落泪 阅读(2730) 评论(0) 推荐(0) 编辑
摘要: 网络IPC:套接字 strcut sockaddr 很多网络编程函数诞生早于IPv4协议,那时候都使用的是sockaddr结构体,为了向前兼容,现在sockaddr退化成了(void *)的作用,传递一个地址给函数,至于这个函数是sockaddr_in还是sockaddr_in6,由地址族确定,然后 阅读全文
posted @ 2019-01-13 21:58 苏格拉底的落泪 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 函数select 函数原型: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); void FD_CLR(int fd, fd_set *set); 阅读全文
posted @ 2019-01-13 21:17 苏格拉底的落泪 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 函数epoll 1. 函数epoll_creat: 该函数生成一个epoll专用的文件描述符: int epoll_creae(int size); 参数: size:epoll上能关注的最大描述符数 2. epoll_ctl:用于控制某个epoll文件描述符事件,可以注册、修改、删除: int e 阅读全文
posted @ 2019-01-13 19:55 苏格拉底的落泪 阅读(403) 评论(0) 推荐(0) 编辑
摘要: 使用lambda创建线程 1. 例子: #include <iostream> #include <thread> #include <chrono> #include <vector> #include <mutex> #include <memory> class Task { public: 阅读全文
posted @ 2019-01-13 19:51 苏格拉底的落泪 阅读(610) 评论(0) 推荐(0) 编辑
摘要: 函数wait 一个进程在终止时会关闭所有文件描述符,释放在用户空间释放的内存,但它的PCB还保留着,内核在其中保存一些信息:如果是正常终止时则保存着退出状态,如果是异常终止则保存着导致该进程终止的信号是哪个,这个进程的父进程可以调用wait或waitpid获取这些信息,然后彻底清除这个进程,我们知道 阅读全文
posted @ 2019-01-13 19:08 苏格拉底的落泪 阅读(362) 评论(0) 推荐(0) 编辑
摘要: 会话 会话:是一个或多个进程组的集合。 创建一个会话需要注意以下6点注意事项: 调用进程不能是进程组组长,该进程变成新会话首进程(session header) 该进程成为一个新进程组的组长进程。 需要root权限(ubuntu不需要) 新会话丢弃原有的终端控制,该会话没有控制终端 该调用进程是组长 阅读全文
posted @ 2019-01-13 18:39 苏格拉底的落泪 阅读(167) 评论(0) 推荐(0) 编辑
摘要: 进程组 (1)进程组,也称之为作业,BSD与1980年前后向UNIX中增加的一个新特性,代表一个或多个进程的集合。每个进程都属于一个进程组,在waitpid函数和kill函数的参数中都曾经使用到,操作系统设计的进程组的概念,是为了简化对多个进程的管理。 当父进程创建子进程的时候,默认子进程与父进程属 阅读全文
posted @ 2019-01-13 18:17 苏格拉底的落泪 阅读(346) 评论(0) 推荐(0) 编辑
摘要: signal函数 1. signal函数原型: #include <signal.h> void (*signal(int signo, void (*func)(int)))(int); 函数功能:为指定的信号安装一个新的信号处理函数。 图解; #include <stdio.h> #includ 阅读全文
posted @ 2019-01-13 18:08 苏格拉底的落泪 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 信号集、sigprocmask、sigpending 信号源为目标进程产生了一个信号,然后由内核来决定是否要将该信号传递给目标进程。从信号产生到传递给目标进程的流程图如下图所示: 进程可以阻塞信号的传递。当信号源为目标进程产生了一个信号之后,内核会执行依次执行下面操作, 1. 如果目标进程设置了忽略 阅读全文
posted @ 2019-01-11 21:22 苏格拉底的落泪 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 信号 一、信号集操作函数 内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以在用程序自定义set来改变mask,来达到屏蔽指定信号目的。 sigset_t set; // typedef unsigned long sigset_t int sigempt 阅读全文
posted @ 2019-01-11 21:19 苏格拉底的落泪 阅读(188) 评论(0) 推荐(0) 编辑
摘要: std::piecewise_construct 值得注意的是 map 类型的 emplace 处理比较特殊,因为和其他的容器不同,map 的 emplace 方法把它接收到的所有的参数都一起转发给 pair 的构造函数。但是对于一个 pair 来说,它既需要构造它的 key 又需要构造它的 val 阅读全文
posted @ 2019-01-08 22:20 苏格拉底的落泪 阅读(670) 评论(0) 推荐(0) 编辑
摘要: 偏特化、全特化 注意: 我们只能部分特例化(偏特化)类模板,而不能部分特例化函数模板。 1. 定义函数模板特例化: #include <iostream> #include <string.h> template <typename T> T Max(T t1, T t2) { return (t1 阅读全文
posted @ 2018-12-12 19:15 苏格拉底的落泪 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 插入迭代器 1. 测试代码: 1 #include<iostream> 2 #include<vector> 3 #include<list> 4 #include<iterator> 5 #include<algorithm> 6 using namespace std; 7 8 void dis 阅读全文
posted @ 2018-10-10 16:08 苏格拉底的落泪 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 泛型算法 1. 例子: #include<iostream> #include<algorithm> #include<vector> #include<string> #include<fstream> using namespace std; void elimDups(vector<strin 阅读全文
posted @ 2018-10-10 15:11 苏格拉底的落泪 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 博客链接: c++ 中 const_iterator 和 const vector<>::iterator的区别 const vector <int> ::iterator和vector <int>::const_iterator有什么不同 注意: const vector <int> vec(10 阅读全文
posted @ 2018-10-10 12:55 苏格拉底的落泪 阅读(197) 评论(0) 推荐(0) 编辑
摘要: AVL树简介 AVL树的名字来源于发明作者G.M. Adelson-Velsky 和 E.M. Landis的缩写。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。 平衡二叉树定义(AVL):它或者是一颗空树,或者具有以下性 阅读全文
posted @ 2018-09-30 10:47 苏格拉底的落泪 阅读(650) 评论(0) 推荐(0) 编辑
摘要: 二叉排序树简介 二叉排序树,又叫二叉查找树,它或者是一棵空树;或者是具有以下性质的二叉树: 若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值; 它的左右子树也分别为二叉排序树。 二叉排序树的创建 假设我们要为数组 {62, 阅读全文
posted @ 2018-09-30 09:39 苏格拉底的落泪 阅读(934) 评论(0) 推荐(0) 编辑
摘要: ASCII表 每个要插入到侵入式容器中的类都需要包含一个 hook,该 hook 将提供可插入容器中的必要数据和资源(比如前后指针),Boost.Intrusive 提供了三种 hook: base hooks member hooks function hooks base hooks 所谓 ba 阅读全文
posted @ 2018-09-26 15:59 苏格拉底的落泪 阅读(108) 评论(0) 推荐(0) 编辑
摘要: 配置nfs-ganesha基于ctdb的高可用配置 参考资料 1. 配置nfs-ganesha基于ctdb的高可用配置 阅读全文
posted @ 2018-09-25 17:19 苏格拉底的落泪 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 实验3:由遍历序列构造二叉树 二叉树构造定理: 定理7.1:任何n(n>0)个不同结点的二又树,都可由它的中序序列和先序序列唯一地确定。 定理7.2:任何n(n>0)个不同结点的二又树,都可由它的中序序列和后序序列唯一地确定。 题目: 已知先序序列为ABDGCEF,中序序列为DGBAECF,则构造二 阅读全文
posted @ 2018-09-19 16:32 苏格拉底的落泪 阅读(1905) 评论(0) 推荐(0) 编辑
摘要: 1) public继承方式 基类中所有 public 成员在派生类中为 public 属性; 基类中所有 protected 成员在派生类中为 protected 属性; 基类中所有 private 成员在派生类中不能使用。 2) protected继承方式 基类中的所有 public 成员在派生类 阅读全文
posted @ 2018-09-18 21:56 苏格拉底的落泪 阅读(536) 评论(0) 推荐(0) 编辑
摘要: 哈夫曼树定义 (01) 路径和路径长度 定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。 例子:100和80的路径长度是1,50和30的路径长度是2,20和10的路径长度是3 阅读全文
posted @ 2018-09-18 21:01 苏格拉底的落泪 阅读(861) 评论(0) 推荐(0) 编辑
摘要: 博客链接: inux中的文件描述符与打开文件之间的关系 1 #include <stdio.h> 2 #include <unistd.h> 3 #include <sys/stat.h> 4 #include <fcntl.h> 5 6 7 int main(int argc, char* arg 阅读全文
posted @ 2018-09-13 15:47 苏格拉底的落泪 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 方法二: 1 #include<iostream> 2 using namespace std; 3 4 struct BTNode 5 { 6 7 char data; 8 BTNode *left, *right; 9 BTNode(char val) : data(val), left(NUL 阅读全文
posted @ 2018-09-12 20:52 苏格拉底的落泪 阅读(139) 评论(0) 推荐(0) 编辑
摘要: 参考资料 1. 红黑树 2. Red–black tree【wikipedia】 3. 维基百科红黑树 阅读全文
posted @ 2018-09-10 21:47 苏格拉底的落泪 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 默认构造函数的构造操作、拷贝构造函数额构造操作 注意:默认构造函数和拷贝构造函数在必要时的时候由编译器产生出来。 参考资料 关于默认构造函数的几个错误认识(四种情况下,编译器会生成默认构造函数) 阅读全文
posted @ 2018-09-02 21:07 苏格拉底的落泪 阅读(274) 评论(0) 推荐(0) 编辑
摘要: 函数fork 博文链接: 1. 代码示例: 1 #include "apue.h" 2 int glob = 6; 3 char buf[] = "a write to stdout\n"; 4 int main(void) 5 { 6 int var; 7 int pid; 8 var = 88; 阅读全文
posted @ 2018-09-02 16:34 苏格拉底的落泪 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 嵌套类 例子: #include <iostream> using namespace std; class c1 { public: int a; void foo(); class c2 { public: int a; void foo(); } b; }; void c1::foo() { 阅读全文
posted @ 2018-08-27 17:47 苏格拉底的落泪 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 运行类型识别 一、使用RTTI dynamic_cast运算符的调用形式如下所示: dynamic_cast<type*>(e) //e是指针 dynamic_cast<type&>(e) //e是左值 dynamic_cast<type&&>(e) //e是右值 e能成功转换为type*类型的情况 阅读全文
posted @ 2018-08-25 21:28 苏格拉底的落泪 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 命令形参 命令行参数是使用main()函数参数来处理的,其中,argc是指传入参数的个数,argv[]是一个指针数组,指向传递给程序的每个参数。 应当指出的是, argv[0]存储程序的名称,argv[1]是一个指向第一个命令行参数的指针,argv[n]是最后一个参数。 如果没有提供任何参数,arg 阅读全文
posted @ 2018-08-13 18:39 苏格拉底的落泪 阅读(184) 评论(0) 推荐(0) 编辑