关于扩展包进程间通讯(以下简称 IPC)的基本概念,请先阅读 IPC 简介。 我们前面介绍了主进程中的 入口程序 和渲染进程中的 面板程序 的基本声明方法和交互方式,接下来我们将结合实际需求介绍两种进程间通讯的详细工作流程。 本节提及的所有相关 API 均可查询 Editor.Ipc 主进程 API 和 Editor.Ipc 渲染进程 API。 发送消息 主进程向面板发送消息 在主进程中,主要使用
我们说falcon-agent是无需配置即可自动化采集200多项监控指标数据,比如cpu相关的、内存相关的、磁盘io相关的、网卡相关的等等,都可以自动发现,自动采集。 端口监控 falcon-agent编写初期是把本机监听的所有端口上报给server端,比如机器监听了80、443、22三个端口,就会自动上报三条数据: net.port.listen/port=22 net.port.listen/
函数和函数对象的灵活多点回调 健壮的触发器及事件处理的机制 兼容于函数对象工厂,如 Boost.Bind 和 Boost.Lambda Boost.Signals 库具体化了信号(signals)和 插槽(slots),信号指的是某种可被"抛出"的 东西,而插槽是接收该信号的连接者。这是一种著名的设计模式,它还有另外一些名字 Observer, signals/slots, publisher/s
保存函数指针和函数对象,用于后续的调用 在含有回调的设计中,常常需要保存函数和函数对象,而且某些函数或类也是 通过函数指针或函数对象来配 制其客户化功能。传统上,通常使用函数指针来实现回调及延迟调用的函数。但是,仅仅使用函数指针会有很多限制,更好的方法是采用泛型机制来定义要被保存的函数的署名特 征,而让调用者来决定提供哪一种类型的函数实体(函数指针或 函数对象)。这样就可以使用任何行为类似于函数的
对函数和函数对象进行适配,使之可用于标准库算法 绑定参数到函数调用 将任意的表达式转换为可以兼容标准库算法的函数对象 就地定义匿名函数,提高代码的可读性和可维护性 在需要的时间和地点实现谓词 在使用标准库或其它采用相似设计的库时,需要依靠函数或函数对象来对算法 进行配置,你通常要编写很多小的函数对象来执行一些非常简单的操作。就象我们在 "Library 9: Bind 9" 看到的那样,这很容易成
使函数和函数对象适用于标准库算法 使用一致语法创建绑定器 强大的函数组合 在使用来自于标准库的算法时,你常常需要提供给它们一个函数或一个函数对象。这是对算法的行为进行定制的一个好方法,但你通常需要写一个新的函数对象,因为你没有组合函数或改变参数的顺序等所需的工具。虽然标准库已经提供了一些可用的工具,如 bind1st 和 bind2nd, 但是这不够用。即使功能上够用了,但这通常意味着要忍受笨拙的
从函数返回多个返回值 相关类型的组合 将数值组合起来 与许多其它的编程语言一样,C++允许函数返回一个数值。但是,这一个数值可以是任意的类型,你可以用一个 struct 或 class 把多个数值组合起来作为结果。虽然可以,但是用这样的结构来组合相关的返回值通常都是很不方便的,因为这意味着要为对一种返回类型进行定义。为了避免在返回值中拷贝大量的对象,同时也为了避免创建一个特殊的类型用于从函数返回多
对用户指定的多种类型的进行类型安全的存储和取回 在标准库容器中存储不同类型的方法 变量访问的编译期检查 高效的、基于栈的变量存储 Variant 库关注的是对一组限定类型的类型安全存储及取回,即非无类的联合。Boost.Variant 库与 Boost.Any 有许多共同之外,但在功能上也有不同的考虑。在每天的编程中通常都会需要用到非无类的联合(不同的类型)。保持类型安全的一个典型方法是使用抽象基
任意类型的类型安全存储以及安全的取回 在标准库容器中存放不同类型的方法 可以在无须知道类型的情况下传送类型 Any库提供一个类型, any, 它允许存入任意类型且稍后取回,而不损失类型安全性。它有点象是可变类型的化合物:它可以持有任意类型,但你必须知道类型才能取回值。有很多次你想在同一 个容器中存入互不相关的类型。有很多次某些代码只想从一个指针向另一个指针传送数据,而不关心数据的类型。从表面看,这
为C++带来了对正则表达式的支持 改进有效输入的健壮性 在文本处理中常常会用到正则表达式。例如,有很多验证有效性的工作适合使用正则表达式。考虑一个应用 程序,它要求输入只由数字组成。而另一个程序可能要求一种特殊的格式,如三个数字,后跟一个字母,再后跟两个数字。你可能要验证邮政编码、信用卡号码、社 会保险号码,或者其它东西;使用正则表达式来做这些验证是很简单的。另外一个可以使用正则表达式的地方是文本
提供一组完整的比较操作符 提供一组完整的算术操作符 提供一组完整的迭代器操作符 C++定义的操作符可以分成几组。当你在一个类中碰到某组操作符中的一个,通常你还会碰到同组中的其它操作符。例如,如果一个类提供了 operator==, 你通常还会看到 operator!= ,或许还有 operator<, operator<=, operator>, 和 operator>=.
编译期断言 BOOST_STATIC_ASSERT 安全的析构 checked_delete 和 checked_array_delete 禁止复制 noncopyable operator&被重载时用 addressof取得对象地址 用enable_if 和 disable_if控制重载与特化 有些工具还不够组成它们自己的库,因此它们与其它实体被集合到一起。这就形成了 Boost.Utility
可理解、可维护,以及一致的多态类型转换 静态向下转型使用比static_cast更 安全的结构 进行范围判断的数字转换确保正确的值逻辑以及更少的调试时间 正确且可重用的文字转换导致更少的编码时间 C++的多功能性是它获得成功的主要原因之一,但有时也是麻烦的来源,因 为语言各部分的复杂性。例如,数字转换规则以及类型提升规则都很复杂。其它转换虽然简单,但也很乏味;多少次我们需要写一个安全的函数[1]来
使用shared_ptr进行对象的生存期自动管理,使得分享资源所有权变得有效且安全。 使用weak_ptr可以安全地观测共享资源,避免了悬挂的指针。 使用scoped_ptr 和 scoped_array限制资源的使用范围,使得代码更易于编写和维护,并有助于写出异常安全的代码。 智能指针解决了资源生存期管理的问题(尤其是动态分配的对象[1]). 智能指针有各种不同的风格。多数都有一种共同的关键特性
Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务。但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到一个启动脚本里面,启动的时候直接启动这个脚本,另外就是安装进程管理工具。 本小节将使用进程管理工具 supervisor 来管理容器中的多个进程。使用 Supervisor 可以更好的控制、管理、重启我们