守护进程详解:理论与实践
什么是守护进程?在 Unix/Linux 系统中,**守护进程(Daemon Process)**是一种长期运行的后台进程,通常不受终端会话控制,适用于服务类任务,如 Web 服务器、数据库管理系统等。
在《Unix 环境高级编程》中,守护进程的特点主要包括:
无控制终端:独立于用户的登录会话。
后台运行:通常使用 fork() 使其脱离控制终端。
会话管理:使用 setsid() 创建新的会话并成为会话首进程。
工作目录:通常切换到 / 避免阻止文件系统卸载。
文件权限:调整 umask(0) 以确保文件权限可控。
日志管理:使用 syslog 记录日志。
守护进程的创建步骤1. 创建子进程并退出父进程pid_t pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
} else if (pid > 0) {
exit(EXIT_SUCCESS); // 让父进程退出
}
2. 创建新会话,使进程脱离控制终端if (setsid() < 0) {
...
FFPlay项目VideoState详细解释
VideoState 结构体是 FFplay(FFmpeg 自带的播放器示例)中的核心数据结构之一,它负责维护播放器的整体状态,包括音视频解码、同步、渲染等功能。下面是对 VideoState 结构体中每个成员变量的详细解释:
线程控制与基本状态
SDL_Thread *read_tid;
读取线程(demux 线程)的指针,用于读取和解析输入媒体文件的数据。
const AVInputFormat *iformat;
指向输入格式的指针,例如 MP4、MKV、AVI 等。
int abort_request;
标志位,指示是否请求终止播放(例如用户主动退出)。
int force_refresh;
标志位,指示是否强制刷新视频画面。
int paused;
当前是否处于暂停状态(1:暂停,0:播放)。
int last_paused;
记录上一次暂停状态,防止状态变化时出现不同步问题。
int queue_attachments_req;
标志位,表示是否需要处理附件(如字幕、封面等)。
int seek_r ...
分享 Shadertoy:探索 GPU 着色器编程的无限可能
什么是 Shadertoy?Shadertoy 是一个基于 WebGL 的在线着色器编程平台,允许开发者使用 GLSL 直接在浏览器中编写和运行 GPU 着色器。它由 Inigo Quilez 创建,广泛用于学习、实验和分享实时渲染技术。
Shadertoy 适用于:
实时渲染:动画、特效、视觉艺术。
计算着色器:图像处理、光线追踪、模拟等。
着色器学习:练习 GLSL 语法,理解 GPU 并行计算。
Shadertoy 着色器结构在 Shadertoy 中,典型的片段着色器(Fragment Shader)代码如下:
void mainImage( out vec4 fragColor, in vec2 fragCoord ) {
vec2 uv = fragCoord / iResolution.xy;
fragColor = vec4(uv, 0.5 + 0.5 * sin(iGlobalTime), 1.0);
}
关键变量解析:
iResolution:画布的分辨率(像素)。
iGlobalTime:从着色器启动以来的时间(秒)。
f ...
系统内存寻址
1、区分三种不同的地址:a、逻辑地址,操作系统将程序分段,逻辑地址包含一个段和一个偏移量,通过段和偏移量进行寻址b、线性地址,也称虚拟地址,32位无符号整数,可表达4GB地址,地址范围从0x00000000~0xffffffffc、物理地址,用于内存芯片级的内存寻址,物理地址通常是32位或者36位的
2、内存控制单元:简称MMU,通过一种称为分段单元的硬件电路将逻辑地址转换为线性地址,接着,成为分页单元的硬件电路将线性地址转换为物理地址
3、内存仲裁器:多处理器中,所有CPU共享同一个内存,意味内存将存在来自CPU的并发访问,从而产生了一种称之为内存仲裁器的硬件电路插在总线和每个RAM芯片之间,作用是当某个RAM芯片空闲了,就准许一个CPU去访问,类似代码中的锁。仲裁器由硬件电路管理,对于编程来说是隐藏的。
4、Intel的分段:a、实模式,存在的主要原因是要维持处理器与早期模型兼容,让操作系统自举b、段选择子,一个16位长的字段c、段寄存器,为了方便找到段选择子,处理器提供段寄存器存储段选择符,其中有CS、SS、DS、ES、FS、GS,这些段寄存器可以用于不同的目的,方法是先保存到内 ...
掩码设计原则
1、基础掩码只能占一位
2、可以加任何偏移,但是运算时需要将偏移减去,不然会影响运算结果
3、位运算 & 用来区分该掩码是否属于某个基类掩码,| 运算则是定义某个组合掩码
git SSL错误解决方法
打开Git Bash运行如下命令
export GIT_SSL_NO_VERIFY=true
git config –global http.sslVerify “false”
在windows的命令行中,进入到git命令所在的磁盘位置,执行下面的git命令
git config –global http.sslVerify false
C++右值引用个人学习所想
右值引用实际是基于左值引用进一步延伸出来的,很有意思,左值引用的形式一般为:
int &a = XXX;
其中XXX可以是常量和变量的组合
而右值引用是:
int &&a = 10;
显而易见,右边必须是一个值,即所谓右值
修改左值引用,就是修改变量的组合形式,或者说改变对变量的引用
修改右值引用,就是修改值对于变量的所有权,或者说修改变量数据所有权。
S7环境下PLC通讯编程方法
一、设置PLC并启动PLC// 设置PLC连接
MinthPlc::getInstance ()->setDB (15); /*!< 修改了mDBNumber成员变量的值 */
MinthPlc::getInstance ()->setPlc ("192.168.10.2", "0", "0");
// 开启PLC线程,开始读写周期
MinthPlc::getInstance ()->start ();
二、读取PLC中的变量步骤:
1、在handleReadWrite函数中获取对应的PLC变量值
2、通过转换大端序到小端序得到正确的值
3、存入全局成员变量
例子:
1.在MinthPlc 中定义成员变量以下代码在MinthPlc.h中的MinthPlc类中定义:
private:
float mCurSpeed; /*!< 读取到的PLC中的速度值 */
int mDBNumber; /*!< DB号,就是 ...
A*和最短路径以及最佳路径的联系
最短路径,顾名思义,关注的是两点之间的线段的权值大小集合最优
最佳路径则是说明某个节点是一个比较好的选择,关注的是这个节点的价值
A*算法则是基于BFS综合考虑了最短路径和最佳路径的寻路算法
总结来说就是将关注点权和线权结合到了一起
记录一次界面程序界面退出但是进程未退出问题解决过程
记一次程序关闭后不退出问题解决问题:打开软件界面,然后关闭最后一个窗口来退出程序,结果发现窗口关闭成功,但是任务管理器中还是有程序运行解决过程:
1、考虑到没进行其他的操作,故从主界面的构造函数出发,检查所有嫌疑点
2、观察到算法clear函数,发现std::vector没有用swap释放内存,可能导致点云生成后内存泄漏且产生相同的问题,但是考虑到这里还没生成点云,故问题的关键还未找到
3、在initPlc函数中找到了初始化boost::asio服务器的线程代码,代码是异步服务器代码,故暂时锁定在此。
4、进一步分析,boost::asio::io_context类调用了run之后,析构函数中没有调用stop结束,不符合RAII,修复此问题,再次试验发现问题不复存在。