FLV格式解析

7 月 25 日
阅读 6 分钟
113
FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站无一例外地使用了FLV格式。另外由于当前浏览器与Flash Player紧密的结合,使得网页播放FLV视频轻而易举,也是FLV流行的原因之一。
封面图

linux编译参数CPPFLAGS、CFLAGS、LDFLAGS的理解

7 月 24 日
阅读 2 分钟
388
linux编译参数CPPFLAGS、CFLAGS、LDFLAGS的理解编译步骤:CPPFLAGS : 预处理器需要的选项 如:-I (大写i指定头文件路径)CFLAGS:编译的时候使用的参数 –Wall –g -cLDFLAGS :链接库使用的选项 –L -l (大写L指定动态库的路径,小写L指定动态库的名称)CFLAGS 表示用于C编译器的选项CXXFLAGS 表示用于C++编译器的选项这两个...
封面图

C++11 promise介绍及使用

7 月 24 日
阅读 3 分钟
135
std::promise是C++11并发编程中常用的一个类,常配合std::future使用。其作用是在一个线程中保存一个类型typename T的值,可供绑定的std::future对象在另一线程中获取该值。
封面图

Android线程思考

7 月 23 日
阅读 6 分钟
243
在编程中我们经常遇到多线程相关的问题,记得刚工作的时候对线程没有太多概念,只知道new Thread()run函数中是新的线程,函数多调用几层,特别是一些别人的回调函数中,就忽略了线程引起的并发问题,产生了并发修改异常的崩溃。今天总结一些线程相关的知识。
封面图

C++11 chrono库详解

7 月 23 日
阅读 6 分钟
144
要使用chrono库,需要#include<chrono>,其所有实现均在std::chrono namespace下。注意标准库里面的每个命名空间代表了一个独立的概念。所以下文中的概念均以命名空间的名字表示! chrono是一个模版库,使用简单,功能强大,只需要理解三个概念:duration、time_point、clock
封面图

C++11 智能指针之shared_ptr

7 月 22 日
阅读 4 分钟
327
基于Alexa的全链路智能语音SDK基于C++实现了跨平台特性,跑通了Android、Mac、Linux等设备,在兼容iOS时发现iOS未提供音频采集和播放的C++接口,所以需要改造SDK,允许SDK初始化时注入外部的采集器和播放器实现类,同时SDK中的Android播放器是基于ffmpeg解码 + opensl实现,但是考虑到包体积的问题,准备也基于这个接口...
封面图

C++11 智能指针之shared_from_this

7 月 22 日
阅读 4 分钟
158
shared_ptr 作用:C++中采用new和delete来申请和释放内存,如果管理不当,很容易出现内存泄露;std::shared_ptr,std::unique_ptr,std::weak_ptr,三种智能指针类,可以自动管理内存使用示例:智能指针对象和一般的指针用法几乎完全相同 {代码...} 原理:只能指针包含两个成员变量:引用计数指针,管理对象的指针当引用计...
封面图

C++11 并发指南五(condition_variable 详解)

7 月 21 日
阅读 11 分钟
141
前面三讲《C++11 并发指南二(std::thread 详解)》,《C++11 并发指南三(std::mutex 详解)》分别介绍了 std::thread,std::mutex,std::future 等相关内容,相信读者对 C++11 中的多线程编程有了一个最基本的认识,本文将介绍 C++11 标准中 <condition_variable> 头文件里面的类和相关函数。

C++11 并发指南三(mutex详解)

7 月 21 日
阅读 5 分钟
168
Mutex 又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mutex> 头文件中,所以如果你需要使用 std::mutex,就必须包含 <mutex> 头文件。
封面图

Android C++系列:函数知识知多少

7 月 20 日
阅读 1 分钟
102
1. 背景函数可以理解为功能的封装,很基础的功能单元,但是因为它虽然看似简单,但是里面涉及了不少知识点和技巧,我们花一篇文章来整理。2. 函数定义函数有以下几部分定义:返回类型函数名称形参列表函数体函数调用的形式是函数名(),函数调用过程涉及到控制权转移。函数体其实是一个语句块,语句块会涉及到作用域的问题...
封面图

Android C++系列:函数返回值注意事项

7 月 20 日
阅读 2 分钟
89
看是有return语句,但是只有循环中满足特定条件才能正常返回,如果找不到的话实际上是没有返回值。编译器可能能检测出这个错误,也可能检测不出来,要看编译器的实现,好在大部分情况编译器甚至IDE可以帮我们检测出来,但是如果不幸我们用了检测不出来的编译器,可能会在运行时发生未定义行为错误。
封面图

Android C++系列:Linux信号(三)

7 月 19 日
阅读 4 分钟
139
可重入函数不含全局变量和静态变量是可重入函数的一个要素可重入函数见man 7 signal在信号捕捉函数里应使用可重入函数在信号捕捉函数里禁止调用不可重入函数例如:strtok就是一个不可重入函数,因为strtok内部维护了一个内部静态指针,保存上一 次切割到的位置,如果信号的捕捉函数中也去调用strtok函数,则会造成切割字...
封面图

Android C++系列:Linux信号(二)

7 月 19 日
阅读 3 分钟
139
如果在进程解除对某信号的阻塞之前这种信号产生过多次,将如何处理?POSIX.1允 许系统递送该信号一次或多次。Linux是这样实现的:常规信号在递达之前产生多次只 计一次,而实时信号在递达之前产生多次可以依次放在一个队列里。本文不讨论实时信 号。每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少 次,阻...
封面图

Android C++系列:Linux信号(一)

7 月 18 日
阅读 4 分钟
141
信号的概念信号的编号kill -l {代码...} 信号机制man 7 signal {代码...} First the signals described in the original POSIX.1-1990 standard. {代码...} 表中第一列是各信号的宏定义名称,第二列是各信号的编号,第三列是默认处理动作:Term表示终止当前进程;Core表示终止当前进程并且Core Dump(Core Dump 用于gdb调...
封面图

Android C++系列:Linux线程(四)线程同步

7 月 18 日
阅读 9 分钟
147
多个线程同时访问共享数据时可能会冲突,这跟我们前面信号文章所说的可重入性是同样的问题。比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成:
封面图

Android C++系列:Linux线程(三)线程属性

7 月 17 日
阅读 5 分钟
150
linux下线程的属性是可以根据实际项目需要,进行设置,之前我们讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问 题。如我们对程序的性能提出更高的要求那么需要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数。
封面图

Android C++系列:Linux线程(二)线程原语

7 月 17 日
阅读 5 分钟
127
void *arg:指定线程将要加载调用的那个函数的参数 返回值:成功返回0,失败返回错误号。之前介绍的系统函数都是成功返回0,失败返回-1,而错误号保存在全局变 量errno中,而pthread库的函数都是通过返回值返回错误号,虽然每个线程也都有一个errno,但这是为了兼容其 它函数接口而提供的,pthread库本身并不使用它,通过...
封面图

Android C++系列:Linux线程(一)概念

7 月 16 日
阅读 1 分钟
106
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kern...
封面图

Android C++系列:Linux文件IO操作(二)

7 月 16 日
阅读 7 分钟
136
注意这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写 位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。比如用fgetc读一个字节,fgetc有可能从内核中预读1024个字节到I/O缓冲区中,再返回第一 个字节,这时该文件在内核中记录的读写位置是1024,而在FILE结构体中记录的读...
封面图

Android C++系列:Linux文件IO操作(一)

7 月 15 日
阅读 3 分钟
103
事实上Unbuffered I/O这个名词是有些误导的,虽然write系统调用位于C标准库I/O缓 冲区的底层,但在write的底层也可以分配一个内核I/O缓冲区,所以write也不一定是直接 写到文件的,也可能写到内核I/O缓冲区中,至于究竟写到了文件中还是内核缓冲区中对于 进程来说是没有差别的,如果进程A和进程B打开同一文件,进程A写到...
封面图

Android C++系列:Linux文件系统(二)

7 月 15 日
阅读 6 分钟
117
Linux支持各种各样的文件系统格式,如ext2、ext3、reiserfs、FAT、NTFS、iso9660 等等,不同的磁盘分区、光盘或其它存储设备都有不同的文件系统格式,然而这些文件系统 都可以mount到某个目录下,使我们看到一个统一的目录树,各种文件系统上的目录和文件 我们用ls命令看起来是一样的,读写操作用起来也都是一样的,这是...
封面图

Android C++系列:Linux文件系统(一)

7 月 14 日
阅读 3 分钟
105
我们知道,一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如某种 mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写 一些管理存储布局的信息。上图是一个磁盘分区格式化成ext2文件系统后的存储布局。
封面图

Android C++系列:Linux网络(五)常见术语

7 月 14 日
阅读 3 分钟
101
路由通常与桥接来对比,在粗心的人看来,它们似乎完成的是同样的事。它们的主要区别在于桥接发生在OSI参考模型的第二层(数据链路层),而路由发生在第三层(网络层)。这一区别使二者在传递信息的过程中使用不同的信息,从而以不同的方式来完成其任务。
封面图

Android C++系列:Linux网络(四)TCP详解

7 月 13 日
阅读 5 分钟
125
这个图N多人都知道,它排除和定位网络或系统故障时大有帮助,但是怎样牢牢地将这 张图刻在脑中呢?那么你就一定要对这张图的每一个状态,及转换的过程有深刻 的认识, 不能只停留在一知半解之中。下面对这张图的11种状态详细解析一下,以便加强记忆!不过在这之前,先回顾一下TCP建立连接的三次握手过程,以及关闭连接的四...
封面图

Android C++系列:Linux网络(三)协议格式

7 月 13 日
阅读 7 分钟
118
传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用 socket API编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下 处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层 数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装...
封面图

Android C++系列:Linux网络(二)通信过程

7 月 12 日
阅读 2 分钟
115
上图对应两台计算机在同一网段中的情况,如果两台计算机在不同的网段中,那么数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器,如下图所示其实在链路层之下还有物理层,指的是电信号的传递方式,比如现在以太网通用的网线 (双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤等都属于物...
封面图

Android C++系列:Linux网络(一)网络模型

7 月 12 日
阅读 2 分钟
2.1k
1. 计算机网络发展概览第一代计算机网络的诞生:1946年产生第一台数字计算机;1954年收发器终端的产生;60年代初,由多重线路控制器参与组成的网络被称为第一代计算机网络。第二代计算机网络的诞生:1964年,Baran提出存储转发概念;1966年,David提出分组概念;1969年,DARPA的计算机分组交换网ARPANET投入运行。第三代计算机...
封面图

Android C++系列:Linux守护进程

7 月 11 日
阅读 2 分钟
146
Daemon(精灵)进程,是Linux中的后台服务进程,生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
封面图

Android C++系列:Linux进程间通信(二)

7 月 11 日
阅读 2 分钟
154
mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存 地址,对文件的读写可以直接用指针来做而不需要read/write函数。
封面图

Android C++系列:Linux进程间通信(一)

7 月 10 日
阅读 3 分钟
315
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不 到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用 户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程 间通信(IPC,InterProcess Communication)。
封面图