
Android C++系列
文章平均质量分 84
轻口味
十年的工作经验,精通C、C++、Python、JAVA、JS、GO等多种编程语言,擅长音视频、即时通讯、人工智能等领域的技术实现与系统设计。在音视频技术、实时通讯系统、AI算法等方面有深入的研究与实践,参与过多个大规模项目的开发与优化。欢迎合作与交流,私信我一起探讨技术发展与项目经验!
展开
-
linux编译参数CPPFLAGS、CFLAGS、LDFLAGS的理解
假设在运行./configure曾经环境变量设置export LDFLAGS=”-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib” ,注意环境变量设置等号两边不能够有空格,并且要加上引号(shell的使用方法)。假如说我们想在makefile里为.c文件进入一个宏定义,就用EXTRA_CFLAGS += DCONFIG_DEBUG( 等价于在.c文件里定义#define CONFIG_DEBUG)原创 2024-07-24 14:48:50 · 2192 阅读 · 0 评论 -
C++11 promise介绍及使用
std::promise是C++11并发编程中常用的一个类,常配合std::future使用。其作用是在一个线程中保存一个类型typename T的值,可供绑定的std::future对象在另一线程中获取该值。假设线程 1 需要线程 2 的数据,则:线程 1 初始化一个 promise 对象和一个 future 对象,promise 传递给线程2,相当于线程 2 对线程 1的一个承诺;future 相当于一个接受一个承诺,用来获取未来线程 2 传递的值;原创 2024-07-24 14:46:38 · 884 阅读 · 0 评论 -
C++11 chrono库详解
std::chrono::steady_clock 为了表示稳定的时间间隔,后一次调用now()得到的时间总是比前一次的值大(这句话的意思其实是,如果中途修改了系统时间,也不影响now()的结果),每次tick都保证过了稳定的时间间隔。std::chrono::duration 表示一段时间,比如两个小时,12.88秒,半个时辰,一炷香的时间等等,只要能换算成秒即可。std::chrono::system_clock 它表示当前的系统时钟,系统中运行的所有进程使用now()得到的时间是一致的。原创 2024-07-23 12:23:32 · 849 阅读 · 0 评论 -
C++11 智能指针之shared_ptr
本文基于项目实战介绍了C++11智能指针的类型转换std::dynamic_pointer_cast,以及特殊的智能指针std::shared_ptr、C++17提供的std::any类型。原创 2024-07-22 19:22:19 · 1764 阅读 · 0 评论 -
C++11 智能指针之shared_from_this
总结一下shared_from_this()使用场景。shared_from_this()实现原理。智能指针对象和一般的指针用法几乎完全相同。原创 2024-07-22 19:14:43 · 798 阅读 · 0 评论 -
C++11 并发指南五(condition_variable 详解)
std::condition_variable 是条件变量,更多有关条件变量的定义参考维基百科。Linux 下使用 Pthread 库中的 pthread_cond_*() 函数提供了与条件变量相关的功能, Windows 则参考MSDN。当 std::condition_variable 对象的某个 wait 函数被调用的时候,它使用 std::unique_lock(通过 std::mutex) 来锁住当前线程。原创 2024-07-21 09:50:15 · 1093 阅读 · 1 评论 -
C++11 并发指南三(mutex详解)
std::mutex,最基本的 Mutex 类。std::recursive_mutex,递归 Mutex 类。std::time_mutex,定时 Mutex 类。std::recursive_timed_mutex,定时递归 Mutex 类。下面以 std::mutex 为例介绍 C++11 中的互斥量用法。原创 2024-07-21 09:49:01 · 986 阅读 · 1 评论 -
Android C++系列:函数知识知多少
返回类型函数名称形参列表函数体函数调用的形式是函数名(),函数调用过程涉及到控制权转移。函数体其实是一个语句块,语句块会涉及到作用域的问题,在函数方法体内定义的变量都是局部变量,局部变量会在函数执行完后被销毁,所以我们不给函数返回局部变量。在函数体内定义的static类型对象称为局部静态对象,局部静态对象一旦定义和初始化,会直到程序终止时才会被销毁,最常用的场景是我们统一函数调用次数,可以在函数体内定义一个static局部静态对象,然后每调用一次累加一次。原创 2024-07-20 20:56:10 · 390 阅读 · 1 评论 -
Android C++系列:函数返回值注意事项
文本介绍了函数返回值的各种小细节:值是如何被返回,返回类类型怎么使用,返回左值引用,返回列表以及返回数组指针等。原创 2024-07-20 20:55:28 · 433 阅读 · 1 评论 -
Android C++系列:Linux信号(三)
本文介绍了可重入函数,信号引起的竞态和异步I/O,SIGCHLD信号处理,向想好捕捉函数传参,信号中断系统调用。原创 2024-07-19 19:32:19 · 987 阅读 · 1 评论 -
Android C++系列:Linux信号(二)
如果在进程解除对某信号的阻塞之前这种信号产生过多次,将如何处理?POSIX.1允 许系统递送该信号一次或多次。Linux是这样实现的:常规信号在递达之前产生多次只 计一次,而实时信号在递达之前产生多次可以依次放在一个队列里。原创 2024-07-19 19:30:43 · 1003 阅读 · 0 评论 -
Android C++系列:Linux信号(一)
本文介绍了信号的编号,信号机制,信号产生的种类,信号产生的原因,以及进程处理信号的行为,信号集处理函数等。原创 2024-07-18 20:19:22 · 915 阅读 · 0 评论 -
Android C++系列:Linux线程(四)线程同步
本文介绍了线程同步机制:为什么要同步、互斥量、死锁、读写锁、条件变量、信号量、进程间锁等概念与机制以及相关示例。原创 2024-07-18 20:16:46 · 832 阅读 · 0 评论 -
Android C++系列:Linux线程(三)线程属性
本文介绍了线程属性:线程属性初始化、线程的分离状态、线程的栈地址、线程的栈大小;还介绍了线程的NPTL、线程终止方式、注意细节等注意事项。原创 2024-07-17 20:31:51 · 1087 阅读 · 0 评论 -
Android C++系列:Linux线程(二)线程原语
本文介绍了linux 线程相关的七个函数:创建线程pthread_create、pthread_self、pthread_exit、pthread_join、pthread_cancel、pthread_detach、pthread_equal。原创 2024-07-17 20:31:02 · 777 阅读 · 0 评论 -
Android C++系列:Linux线程(一)概念
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。原创 2024-07-16 19:13:12 · 901 阅读 · 0 评论 -
Android C++系列:Linux文件IO操作(二)
本文介绍了read/write的系统调用,以及阻塞、非阻塞相关的概念以及配置方式,等待超时方式。还介绍了lseek、fcntl、ioctl文件操作相关的系统调用。原创 2024-07-16 19:11:51 · 776 阅读 · 0 评论 -
Android C++系列:Linux文件IO操作(一)
文本介绍了Linux下的文件操作命令、系统调用、API接口等。并介绍了C标准函数与系统函数的区别,PCB概念等。原创 2024-07-15 08:27:10 · 1308 阅读 · 0 评论 -
Android C++系列:Linux文件系统(二)
Linux支持各种各样的文件系统格式,如ext2、ext3、reiserfs、FAT、NTFS、iso9660 等等,不同的磁盘分区、光盘或其它存储设备都有不同的文件系统格式,然而这些文件系统 都可以mount到某个目录下,使我们看到一个统一的目录树,各种文件系统上的目录和文件 我们用ls命令看起来是一样的,读写操作用起来也都是一样的,这是怎么做到的呢?当rm删除文件时,只是删除了目录下的记录项和把inode硬链接计数减1,当硬链接计数 减为0时,才会真正的删除文件。把目录指针恢复到目录的起始位置。原创 2024-07-15 08:24:22 · 1350 阅读 · 0 评论 -
Android C++系列:Linux文件系统(一)
本文介绍了经典的ext2文件系统的块结构:超级块、块组描述符表(GDT)、块位图、inode位图(inode Bitmap)。数据块(Data Block) 根据不同的文件类型对应情况,并介绍了数据块寻址方式。原创 2024-07-14 08:51:47 · 678 阅读 · 0 评论 -
Android C++系列:Linux网络(五)常见术语
网络信息从信源到信宿的路径。路由是指路由器从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个接口的过程。路由通常与桥接来对比,在粗心的人看来,它们似乎完成的是同样的事。它们的主要区别在于桥接发生在OSI参考模型的第二层(数据链路层),而路由发生在第三层(网络层)。这一区别使二者在传递信息的过程中使用不同的信息,从而以不同的方式来完成其任务。确定最佳路径,通过网络传输信息。原创 2024-07-14 08:49:15 · 884 阅读 · 0 评论 -
Android C++系列:Linux网络(四)TCP详解
本文介绍了TCP的三次握手、四次挥手、11种状态、TCP滑动窗口流量控制、TCP半连接状态以及TCP TIME_WAIT两倍报文最大生存时长。原创 2024-07-13 22:25:40 · 1034 阅读 · 0 评论 -
Android C++系列:Linux网络(三)协议格式
本文介绍了网络协议格式:数据包封装、以太网帧格式、ARP数据包格式、IP段格式、UDP数据包格式、TCP数据包格式等。原创 2024-07-13 22:23:36 · 769 阅读 · 0 评论 -
Android C++系列:Linux网络(二)通信过程
以太网驱动程序首先根据以太网首部中的“上层协议”字段确定该数据帧的有效载荷 (payload,指除去协议首部之外实际传输的数据)是IP、ARP还是RARP协议的数据报,然后交给相应的协议处理。上图对应两台计算机在同一网段中的情况,如果两台计算机在不同的网段中,那么数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器,如下图所示其实在链路层之下还有物理层,指的是电信号的传递方式,比如现在以太网通用的网线 (双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤等都属于物理层的概念。原创 2024-07-12 12:01:57 · 470 阅读 · 0 评论 -
Android C++系列:Linux网络(一)网络模型
两者都是以协议栈的概念为基础;协议栈中的协议彼此相互独立;下层对上层提供服务OSI先有模型;TCP/IP是先有协议后有模型;OSI适用于各种协议栈,TCP/IP只适用于TCP/IP网络;层次数量不同。原创 2024-07-12 11:59:52 · 808 阅读 · 0 评论 -
Android C++系列:Linux守护进程
本文介绍了守护进程的概念,守护进程的编程步骤,代码实现,以及守护进程的作用。帮助我们理解后台程序的运行原理等。原创 2024-07-11 17:37:40 · 732 阅读 · 0 评论 -
Android C++系列:Linux进程间通信(二)
本文介绍了mmap函数:mmap可以把磁盘文件的一部分直接映射到内存,这样文件中的位置直接就有对应的内存 地址,对文件的读写可以直接用指针来做而不需要read/write函数。原创 2024-07-11 17:36:47 · 482 阅读 · 0 评论 -
Android C++系列:Linux进程间通信(一)
本文介绍了Linux进程通信的概念:解决任何一个进程的全局变量在另一个进程中都看不到的问题,以及最常用的进程同行机制:管道。原创 2024-07-10 07:49:10 · 1045 阅读 · 0 评论 -
Android C++系列:Linux进程间关系
本文介绍了linux终端的进程知识,本地终端、网络终端的虚拟终端原理;进程组概念getpgid、getpgrp;进程会话概念setsid等。原创 2024-07-10 07:47:31 · 1031 阅读 · 0 评论 -
Android C++系列:Linux进程(三)
本文介绍了僵尸进程和孤儿进程的概念解决方案。僵尸进程: 子进程退出,父进程没有回收子进程资源(PCB),则子进程变成僵尸进程;孤儿进程: 父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为1号 进程init进程,称为init进程领养孤儿进程。原创 2024-07-09 07:58:34 · 437 阅读 · 0 评论 -
Android C++系列:Linux进程(二)
本文介绍了进程原语:fork和exec。fork调用一次返回两次:父进程中返回子进程ID;子进程中返回0;读时共享,写时复制。原创 2024-07-09 07:57:29 · 729 阅读 · 0 评论 -
Android C++系列:Linux进程(一)
我们知道一个程序可以多次加载到内存,成为同时运行的多个进程,例如可以同时开多 个终端窗口运行/bin/bash,另一方面,一个进程在调用exec前后也可以分别执行两个不同 的程序,例如在Shell提示符下输入命令ls,首先fork创建子进程,这时子进程仍在执行/ bin/bash程序,然后子进程调用exec执行新的程序/bin/ls。按照惯例,环境变量字符串都是name=value这样的形式,大多数name由大写字母加下划 线组成,一般把name的部分叫做环境变量,value的部分则是环境变量的值。原创 2024-07-08 14:32:09 · 994 阅读 · 0 评论 -
Android C++系列:Linux常用函数和工具
本文介绍了Linux常用命令工具及函数:文件访问时间函数、cpu使用时间函数、ifconfig、netstat、设置IP方式等。原创 2024-07-08 14:30:38 · 1279 阅读 · 0 评论 -
Android C++系列:Linux Socket编程(四)多路IO转接服务器
本文介绍了Linux多路复用的三种技术:select、poll、epoll。原创 2024-07-07 06:07:40 · 521 阅读 · 0 评论 -
Android C++系列:Linux Socket编程(三)CS模型示例
本文分别介绍了基于TCP和UDP的客户端和服务器的开发流程及对应实现。原创 2024-07-07 06:06:33 · 756 阅读 · 0 评论 -
Android C++系列:Linux Socket编程(二)网络套接字函数
本文介绍了网络套接字函数:socket、bind、listen、accept、connect等。原创 2024-07-06 16:25:58 · 863 阅读 · 0 评论 -
Android C++系列:Linux Socket编程(一)预备知识
本文介绍了网络字节序概念以及字节序转换C函数、IP地址转换函数、sockaddr数据结构等。原创 2024-07-06 16:20:22 · 742 阅读 · 0 评论 -
Android C++系列:NDK减少so库体积方法总结
本文介绍了删除无用模块,平台能力替代第三方库,使用strip,设置编译器优化的flag,使用gc-sections去除没有用到的函数,设置可见性,去除iostream等有助于动态库体积优化的方法。原创 2024-07-05 00:20:05 · 499 阅读 · 0 评论 -
Android C++系列:JNI中的Handler--ALooper
本文回顾了Android 传统Handler机制,以及在JNI中实现Looper和JNI提供的ALooper的使用方式和技巧:使用管道来实现线程通信,并通过自定义通信协议来解决粘包问题。原创 2024-07-05 00:18:30 · 451 阅读 · 0 评论 -
Android C++系列:JNI中的线程操作
本文介绍了通过C语言创建线程的方法和C层等待线程返回的方法,以及JNI提供的AttachCurrentThread 和 DetachCurrentThread方法,通过该方法将C线程附着到Java虚拟机,同时我们还介绍了JNI_OnLoad方法和JavaVM结构。原创 2024-07-04 00:47:44 · 1018 阅读 · 0 评论