
Linux
文章平均质量分 52
jwybobo2007
站在脚下看世界
展开
-
linux音视频采集技术: v4l2
在 Linux 系统中,视频设备的支持和管理离不开 V4L2(Video for Linux 2)。作为 Linux 内核的一部分,V4L2 提供了一套统一的接口,允许开发者与视频设备(如摄像头、视频采集卡等)进行交互。无论是视频采集、处理,还是编码和显示,V4L2 都提供了强大的支持。本文将简单介绍一下 V4L2 的工作流程以及如何使用它进行视频采集。v4l2并没有提供单独封装的API接口,而是通过 ioctl 系统调用以及v4l2所提供的特定参数来对设备进行控制和采集。:查询设备能力。原创 2025-01-07 15:37:54 · 1198 阅读 · 0 评论 -
IPv6万能地址[::]使用的注意点
当这个选项被设置为 true(1)时,套接字将不接受IPv4映射地址,这意味着它将只接受IPv6通信。当设置为 false(0)时,套接字将同时接受IPv6通信和IPv4映射地址,使得可以在单个端口上同时监听IPv4和IPv6。需要注意的是,IPv6的万能地址绑定监听后实际是可以同时支持IPv4和IPv6的客户端连接的(双栈环境中)。为 false 在IPv4和IPv6双栈环境中非常有用,可以简化服务端的实现代码,从而减少开发工作量。另外需要注意,当有两个套接字同时监听IPv4和IPv6的相同端口,并且。原创 2024-12-06 17:54:51 · 376 阅读 · 0 评论 -
redis7.x源码分析:(6) bio后台服务
当任务到来时,主线程将任务添加到相应操作类型的任务队列中,并唤醒等待在该队列上的线程。redis的BIO(Background I/O)顾名思义:后台I/O服务,是Redis中用于处理一些需要异步执行的后台任务的一个线程池。由此我们也可以看出,redis其实并非真正的单线程程序,只是它的主要数据库读写处理流程是在主线程完成的,但内部是会启动多种线程来辅助提升效率的。除了BIO的线程外,后续我还会讲解网络IO多线程的代码实现,也会涉及到整体主流程框架的实现原理。作者:jwybobo2007。原创 2024-11-28 09:54:39 · 299 阅读 · 0 评论 -
redis7.x源码分析(目录)
redis7.x源码分析:(1) sds动态字符串redis7.x源码分析:(2) adlist双向链表redis7.x源码分析:(3) dict字典redis7.x源码分析:(4) ae事件处理器(一)redis7.x源码分析:(5) ae事件处理器(二)原创 2024-11-24 23:56:47 · 327 阅读 · 0 评论 -
redis7.x源码分析:(5) ae事件处理器(二)
Redis的定时器实现比较简单,它并未使用最小堆或者时间轮之类的方式来管理定时事件,而是直接使用一个双向链表把所有的定时器事件串起来,然后通过遍历去实现一些功能。从代码中可以看出,最早超时时间就是通过遍历链表找出超时时间when最小的事件来实现的。对于定时器的删除操作不会立即执行,而是将定时器修改为无效,在下一轮的 processTimeEvents 中处理。它是在 aeProcessEvents 的函数末尾调用的,通过遍历链表确认是否有事件超时,然后执行相应的超时回调。接上篇,接下来看定时器事件的处理。原创 2024-11-23 13:00:00 · 366 阅读 · 0 评论 -
redis7.x源码分析:(4) ae事件处理器(一)
ae模块是redis实现的Reactor模型的封装。它的主要代码实现集中在 ae.c 中,另外还提供了平台相关的io多路复用的封装,它们都实现了一套相同的poll接口,就类似于C++中提供了一个接口基类,由针对不同平台的派生类去实现。aeEventLoop中的events是用于保存fd注册事件的数组,它是以fd值作为索引来存取事件的。实际使用的io模型会根据编译时定义的宏在 ae.c 的代码头部直接引入。接下来再看一下ae相关接口,先看下fd相关实现。原创 2024-11-22 16:00:28 · 470 阅读 · 0 评论 -
redis7.x源码分析:(3) dict字典
另外,dict对hash值相同的key采用了常规的开链法存储,而unordered_map在采用开链法的前提下,又使用了_M_before_begin将不同桶中的链表串联成了一个大链表,从而将遍历速度优化为O(n);还有就是,dict为应对服务器性能上的特殊要求,设计成了双hash表的形式,这也使得它的rehash等操作存在一些特殊性。hash表的创建比较简单直接略过,先看下 _dictExpand 的实现,它在hash表扩容缩容和创建时都会用到。两者在代码实现层面存在一些差异,比如gnustl的。原创 2024-11-14 18:05:00 · 631 阅读 · 0 评论 -
redis7.x源码分析:(2) adlist双向链表
listNode中的value定义为void *,所以它可以被用来存储任意类型的数据。而对于不同的数据,在处理时可能需要用到不同的函数,因此在list中定义了3个函数指针,分别对应不同类型数据的复制、释放和对比功能。当对value进行处理时,如果设置了函数指针,就有可能会调用它们进行相应处理。链表是一种常用的数据结构(如果不了解,请先学习数据结构),由于c语言本身没有实现标准的链表库,所以redis自己实现了一个双向链表。双向链表在redis内部的使用非常的多,几乎所有模块中都有用到。原创 2024-11-12 18:03:49 · 362 阅读 · 0 评论 -
redis7.x源码分析:(1) sds动态字符串
其实它和C++标准库中的string在一定程度上是比较类似的,都是用来完成对字符串缓冲区的动态分配、管理以及其它一些相应操作的。另外,sds在设计中本身也是二进制安全的,而且sds会在末尾多分配1字节并且置’\0’,用于防止一些字符串操作的越界问题。sds的定义非常简单,直接就是一个char*的别名,因此sds本身具备C字符串的特性,可以使用strcpy、strlen等函数。sds在分配空间时,是包含头结构的,但真正返回的却是buf成员的地址,这就是sds具备C字符串的特性的原因。原创 2024-11-11 18:02:08 · 441 阅读 · 0 评论 -
linux下编译鸿蒙版boost库
我在上一篇文章中介绍了curl和openssl的编译方式(),这篇再介绍一下boost库的编译。原创 2024-10-16 19:04:16 · 913 阅读 · 0 评论 -
linux下编译鸿蒙版curl、openssl
是一个用相对路径表示的统一编译安装目录,openssl和curl都会引用以及安装到这个目录下,所以要保证两个开源库使用的编译脚本中的这个相对路径指向同一目录。如果有什么问题的话,也可以自己手动改成想要的路径,两个脚本一致就行。目前我编译的全部都是静态库,如果需要编译动态库的话,还需要调整下编译脚本中的参数。具体的参数可以查看openssl和curl的编译说明。curl使用的版本是 7.81。如果中间没有错误的话,在。下会生成以下文件和文件夹。原创 2024-10-12 17:00:08 · 1325 阅读 · 0 评论 -
linux下不同库出现符号冲突的解决方式
在linux下开发时,可能会碰到不同库导出同名函数符号,导致行为异常的问题。举个例子:我的test.cpp需要链接以及,并且两个so库中都有一个同名的函数符号PrintInt,那在 test.cpp 中我想调用liba.so的PrintString时实际会调用函数符号呢?答案是根据链接顺序来。先链接先加载哪个库就会使用哪个库的符号。假设我们先链接加载的libb.so,那test实际会调用的就是libb.so中的PrintInt,这很明显不符合我们的期望,并且很可能会更一步导致crash。原创 2024-09-24 17:01:28 · 997 阅读 · 0 评论 -
linux下avi文件解析(附源码)
前段时间由于项目需要,要解avi文件,当时我第一时间想到用ffmpeg来处理,但想想觉得太大了,又是放到arm上跑的,感觉没必要。然后,搜索引擎上稍微搜了一下,没找到有用的示例,大部分都是利用windows的api进行读写,很明显linux下用不了。结果花了2-3天时间研究并写了一个avi文件的解封装代码,但是后来因某些原因没有去使用AVI了,所以代码也没进行后续的完善优化。这里贴出来供记录以及需原创 2012-06-18 16:57:18 · 5993 阅读 · 17 评论 -
测试指定udp端口是否可以绑定
// 测试指定udp端口是否可以绑定,WIN32下记得要先初始化WSAStartup bool udpBindTest(uint16_t port) { SOCKET sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (sockfd == INVALID_SOCKET) return false; struct soc原创 2013-02-18 17:06:01 · 2666 阅读 · 1 评论 -
linux最大打开描述符量修改
1.使用命令在bash中使用ulimit,仅对当前shell生效另外可以在bashrc等启动脚本里面加上ulimit的命令行2.使用函数在自己的程序中调用setrlimit来修改3.修改配置文件(没试过,看到别人写的)debian/redhat下修改/etc/security.limits.conf,增加类似如下两行:* soft nofile 4096* hard原创 2013-02-19 10:15:35 · 476 阅读 · 1 评论 -
(自用型)windows/linux网络编程通用跨平台头文件定义
#ifndef _SOCKET_TYPE_H#define _SOCKET_TYPE_H#ifdef _WIN32#include #define ERRNO (WSAGetLastError())#define NEEDBLOCK WSAEWOULDBLOCKtypedef int socklen_t;#else#include #include #include #i原创 2013-02-19 09:09:41 · 3205 阅读 · 0 评论 -
gdb分析coredump的几个常用命令介绍
1.info proc mappings显示各个模块(可执行程序、动态库等)segment映射的虚拟内存地址列表2.info register显示寄存器的值例:(gdb) info registerrax 0xdbbb6a00007f719b -2613378610517544549rbx 0x9e4b82c0 2655748800rcx 0x3 3rdx 0x0 0rsi原创 2020-12-09 10:35:22 · 1186 阅读 · 0 评论 -
linux errno参考
#define EPERM 1 /* Operation not permitted */#define ENOENT 2 /* No such file or directory */#define ESRCH 3 /* No such process */#define EINTR 4 /* Interrupted system call */#define EIO 5 /* I/O error */#define ENXIO 6 /* No such device .原创 2020-11-30 23:50:47 · 422 阅读 · 0 评论 -
vscode编译调试linux c/c++
1.远程打开linux服务器上的开发工程文件夹(具体工程不进行介绍了),如:/home/user/my_pro2.在产生的 .vscode 文件夹下放置 launch.json,tasks.json 配置文件,内容如下:launch.json:{ "version": "0.2.0", "configurations": [ { // 工程项目名称 "name": "test1", "原创 2020-08-17 13:43:11 · 364 阅读 · 0 评论 -
linux下使用gclient工具报错的问题处理
Your PATH contains a literal "~", which works in some shells but will break when python tries to run subprocesses. Replace the "~" with $HOME.如果出现如上的错误,说明在 exportdepot_tools的路径时,使用了~符号来表示用户文件夹,而p...原创 2020-01-04 17:35:26 · 1461 阅读 · 0 评论 -
ubuntu 重起黑屏解决方法
Alt+F4就出来命令窗口了,输入帐户密码登录。OK原创 2011-10-26 10:47:35 · 727 阅读 · 0 评论 -
linux kernel中的免锁算法
在《LINUX设备驱动程序》(第三版)有几页对免锁算法的实现进行了分析。对于作者的分析有两点我想在这里作更加细致的说明。一是作者对循环缓冲的分析,当缓冲区满时分析错了;二是作者没有对里面的实现技巧作详细的介绍。针对以上两点,本文就用2.6.11(2.6.10和2.6.11是一样的)的kfifo.h和kfifo.c代码实现的免锁算法进行较为详细的分析。 对于临界区的访问一般的做法是转载 2011-12-29 14:21:40 · 1143 阅读 · 0 评论 -
linux下fork出的子进程去掉对主进程的继承
在linux中,一旦fork出子进程后,子进程就会继承主进程的描述符,这为开发者带来了不少问题,比如当我使用socket的时候,一旦我绑定了某个端口,而后fork,如果此时fork出的子进程不退出的,那么我主进程重启后,就会出现无法绑定端口的问题。当然解决这种问题你可以选择在socket初始化时,加入SOCK_CLOEXEC这个选项,使得子进程不继承。那下面就介绍一种通用方法(如有问题,欢迎指出)原创 2012-09-29 15:17:20 · 6969 阅读 · 4 评论 -
linux的cache memory解析
PS:前天有童鞋问我,为啥我的Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量缓存内存以提高读写性能,通常叫做Cache Memory。有时候你会发现没有什么程序在运行,但是使用top或free命令看到可用内存free项会很少,此时查看系统的 /proc/meminfo 文件,会发现有一项 Cached Memory:输入ca转载 2013-01-04 15:34:56 · 1569 阅读 · 0 评论 -
svn常用命令集合
修改登录账户:svn --username chen info http://192.168.1.110:8080/svn/project1、将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain 简写:svn co 2、往版本库中添加新的转载 2013-05-22 15:49:24 · 805 阅读 · 0 评论 -
gcc预置宏的查看命令
gcc -dM -E -原创 2013-06-06 17:22:22 · 1010 阅读 · 0 评论 -
Shell 显示带颜色字体
格式: echo "/033[字背景颜色;字体颜色m字符串/033[控制码"如果单纯显示字体颜色可以固定控制码位0m。格式: echo "/033[字背景颜色;字体颜色m字符串/033[0m"字背景颜色范围:40 - 4940:黑 41:深红 42:绿 43:黄色 44:蓝色 45:紫色 46:深绿 47:白色 字颜色转载 2013-06-17 10:41:31 · 1023 阅读 · 0 评论 -
linux开发辅助命令(二)
1.查看进程打开的文件lsof2.查看ipv4,ipv6监听状态与对应进程lsof -Pnl +M -i4lsof -Pnl +M -i63.查看rpm安装信息rpm -ql 安装包名称4.修改当前shell的可打开描述符最大值ulimt -SHn 65535待续 ...原创 2013-05-30 09:20:04 · 766 阅读 · 0 评论 -
用 RPM 打包软件
http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part1/index.htmlhttp://www.ibm.com/developerworks/cn/linux/management/package/rpm/part2/index.htmlhttp://www.ibm.com/developerwo转载 2013-06-25 17:04:26 · 751 阅读 · 0 评论 -
malloc分配原理浅析 mmap关注焦点 如何优化分配内存
现象1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大于10000。 初步分析majflt代表major fault,中文名叫大错误,min转载 2013-07-02 09:10:56 · 6864 阅读 · 1 评论 -
linux程序编译期加入编译时间和svn版本号
通常我们在程序开发时会加入版本查询命令,如:“-v”,此时一般会显示build版本,以及build日期等,因此如果每次编译时能自动添加这些信息的话,就非常方便了。下面先说说添加时间的方法:1.最简单方式,代码中直接加入宏__TIME__和__DATE__通过他们可以直接得到编译时间,然后可以在代码里打印2.有点绕不实用,在Makefile中定义一个变量CT="\"`date原创 2012-10-26 13:36:20 · 13641 阅读 · 4 评论 -
Linux下利用双网卡构建网关截获数据包
eth0 作为其它设备网关(我的网段都是 192.168.1.*)echo 1 > /proc/sys/net/ipv4/ip_forwardecho 0 > /proc/sys/net/ipv4/tcp_timestampsiptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE iptables -t nat -A POSTROUTI原创 2016-04-19 18:25:55 · 950 阅读 · 0 评论 -
RTP封装h264
文章部分借用网上搜索到的资料网络抽象层单元类型 (NALU):NALU头由一个字节组成,它的语法如下: +---------------+ |0|1|2|3|4|5|6|7| +-+-+-+-+-+-+-+-+ |F|NRI| Type | +---------------+F: 1原创 2011-12-08 17:41:17 · 27487 阅读 · 9 评论 -
ubuntu切换用户为root
1.改密码sudo passwd root 2.切换su root原创 2011-10-26 10:45:47 · 482 阅读 · 0 评论