- 博客(246)
- 收藏
- 关注
原创 Debian 开发板(tq3568)安装 fcitx 输入法并解决 sudo 运行 Qt 程序无法输入中文的问题2.0
问题现象根本原因解决方案fcitx 启动报“无可用前端”缺少前端模块或环境变量未设置步骤1 + 步骤2sudo 程序无法调用输入法sudo 重置环境变量步骤3仍无法使用输入法XIM 冲突步骤6以上配置已在 tq3568 Debian 开发板上长期使用,稳定可靠。如有其他桌面环境(如 XFCE/LXDE),配置方法完全相同。
2026-05-13 15:12:06
200
原创 TQ3568 开发板 Debian 系统无WiFi故障排查
硬件层面:开发板板载WiFi物理硬件完好;系统层面:第三方Debian镜像设备树阉割关闭WiFi,无对应节点、无供电、无USB枚举;表现连锁反应:lsusb看不到WiFi设备 → ip a 无wlan0 → 系统网络管理器识别不到WiFi → 状态栏只显示以太网;
2026-05-09 10:44:21
60
原创 本地n8n完整安装
再右键安装包 → 以管理员身份运行。,不是文件夹路径,直接复制就行。出现一长串英文+数字,就说明。注册账号 → 直接进入界面。n8n 镜像在国外,
2026-04-22 15:36:24
152
原创 Protocol Buffers (protobuf) 编译与使用(Windows + VS2022)
但是,一旦你开始追求性能,或者你的程序需要频繁、大量地传输数据,JSON 和 XML 的问题就出来了:它们太啰嗦了,解析也慢。做网络通信或者本地存储数据的时候,我们经常需要把结构化的数据(比如一个用户信息:ID、名字、年龄)打包成一串字节,发给别人,或者存到文件里。你可以给 message 加新字段,老的程序编译的时候用的旧定义,但它收到新数据时,会忽略不认识的新字段;解析 JSON 要处理文本,而 protobuf 解析的是二进制,不用管字符编码、引号、转义,直接按格式读数据,快得多。
2026-04-13 16:32:22
210
原创 【Qt 开发笔记】能扛住断电、多线程的通用配置类(移植直接用)
做上位机和工控软件久了会发现,配置文件看着简单,坑却特别多。程序写一半突然断电、多线程同时读写、异常退出,都能把配置文件搞坏,轻则参数丢失,重则软件直接起不来。为了以后新项目移植不用重复造轮子,我把自己一直在用的配置管理类整理了一下,自带线程安全、原子写入、自动备份,INI/JSON/XML 都能用,基本能应对大部分现场稳定运行的需求。
2026-04-11 14:46:58
302
原创 【Linux开发】静态库开发与Makefile入门
静态库是一组目标文件(.o)的打包归档文件(通常以.a结尾)。在程序链接阶段,链接器会将静态库中需要的代码复制到最终的可执行文件中,因此生成的可执行文件不依赖该库,可以独立运行。优点运行时无需加载库文件,执行速度快。不依赖外部环境,部署简单。缺点每个使用库的程序都包含一份代码副本,浪费磁盘和内存。更新库需要重新编译整个程序。优点缺点部署简单,不依赖外部可执行文件体积大运行效率高库更新需重新编译程序避免版本冲突多进程共享时内存占用多# 直接赋值(递归展开)# 立即赋值(简单展开)
2026-04-09 09:23:16
386
原创 【Linux开发--->Windows开发】I/O 复用:IOCP 模型
/ 每个套接字对应的上下文(Per-Handle Data)// 客户端套接字// 重叠结构,必须作为第一个成员或能被准确跟踪// WSASend/Recv 使用的缓冲区结构// 数据缓冲区// 本次传输的字节数// 当前操作类型:0=接收,1=发送// 全局 IOCP 句柄场景推荐高并发 TCP 服务器(如网关、代理服务器)✅ 强烈推荐文件服务器(异步文件 I/O)✅ 推荐数据库服务器(处理大量连接)✅ 推荐UDP 服务器(需要高性能)✅ 推荐小规模应用。
2026-04-08 16:04:13
62
原创 【Linux开发】I/O 复用:poll 模型
无描述符上限:只受系统内存限制,可通过ulimit -n调整。数据结构清晰events和revents分离,不需要每次重新构造。跨平台:几乎所有 UNIX 系统(包括 Linux、BSD、macOS)都支持,Windows 也有WSAPoll(功能类似)。编程简单:比select稍好,比epoll简单。poll是select的改进版,它去掉了描述符上限,使用数组管理,避免了fd_set的大小限制。但仍需遍历所有 fd,在大量连接但少数活跃时效率不如epoll。
2026-04-08 15:58:08
380
原创 【Linux开发】I/O 复用:epoll 模型
所有可能产生 EAGAIN 的套接字都必须设为非阻塞(监听套接字也最好设为非阻塞,但这里仅示范客户端)。注册事件时加上EPOLLET标志。在while循环中反复调用read,直到返回-1且,才能保证读完所有数据。处理完数据后不要忘记处理连接关闭epoll是 Linux 下高性能 I/O 复用的首选方案。三大核心函数(创建实例)、epoll_ctl(添加/删除监视)、epoll_wait(等待事件)。水平触发(LT):简单,适合大多数场景。边缘触发(ET)
2026-04-08 15:31:28
379
原创 【Linux开发】I/O 复用:select 模型
I/O 复用用一个进程监视多个套接字,避免多进程/多线程的高昂开销。select是最简单的 I/O 复用模型,通过fd_set管理监视对象,通过select等待事件。实现步骤:创建监听套接字,加入fd_set。循环调用select。根据FD_ISSET判断事件类型:监听套接字 →accept新连接,加入集合。客户端套接字 →read数据,返回 0 表示断开,否则处理数据。
2026-04-08 14:57:36
997
原创 【Linux开发】多线程并发服务器(网络编程+多线程+线程同步实现的聊天服务器和客户端)
这是一个基于TCP + 多线程的聊天室程序,支持多个客户端同时在线聊天。知识点代码位置说明TCP Socketsocket()bind()listen()accept()服务器端网络通信客户端连接connect()主动连接服务器多线程创建为每个客户端创建独立线程线程分离线程结束自动回收资源互斥量保护共享数据(客户端列表)广播消息send_msg()遍历所有客户端发送消息移除断开客户端中的循环从数组中删除已断开连接的客户端。
2026-04-07 19:56:47
80
原创 【Linux开发】04Linux 线程的销毁
特性是否阻塞✅ 阻塞❌ 不阻塞获取返回值✅ 可以❌ 不可以能否再次回收只能一次分离后不能再操作适用场景需要等待结果后台任务,无需结果资源回收调用时回收线程结束时自动回收主线程需等待自动同步需额外同步(如 sleep)线程结束 ≠ 资源释放。要么用主动等待回收(阻塞),要么用让系统自动回收(非阻塞)。二选一,绝不遗漏,否则僵尸线程会吃光你的内存!
2026-04-07 19:35:21
158
原创 【Linux开发】03Linux 线程同步:信号量(Semaphore)
每进入一辆车,剩余车位减 1(P 操作)。每离开一辆车,剩余车位加 1(V 操作)。如果剩余车位为 0,后面来的车必须等待。信号量P(等待):如果计数器 > 0,则减 1 并继续;否则阻塞等待。V(发信号):计数器加 1,并唤醒一个等待的线程(如果有)。概念说明信号量一个整数计数器,支持原子增减和阻塞等待P 操作(wait)值减 1,若值为 0 则阻塞V 操作(post)值加 1,唤醒等待线程二进制信号量值 0/1,类似互斥量计数信号量值 >1,控制并发数量顺序控制。
2026-04-07 16:37:28
188
原创 【Linux开发】02Linux 线程同步:互斥量(Mutex)
多个线程同时访问共享变量可能导致数据不一致,原因是操作不是原子的。互斥量提供了“锁”机制,保证同一时间只有一个线程进入临界区。定义 → 初始化 → 加锁 → 解锁 → 销毁。注意死锁、忘记解锁、锁粒度等问题。
2026-04-07 16:22:33
157
原创 【Linux开发】01多线程编程:线程的创建与运行
函数作用创建新线程等待线程结束并获取返回值获取当前线程的 ID主动终止当前线程(类似return。
2026-04-07 16:09:51
324
原创 【Linux开发】05进程间通信方式之消息队列
消息队列是内核中的一个链表,每个节点是一条消息。消息类型(一个正整数)和消息数据。发送进程将消息放入队列尾部。接收进程可以从队列中按消息类型取出消息(不一定 FIFO,可以按类型优先级取)。long type;// 消息类型(必须第一个成员)// 消息内容#endif错误:忘记让第一个成员是long类型。long type;// 错误!type 必须在最前面正确long type;函数作用创建或获取消息队列发送消息接收消息(按类型)删除消息队列。
2026-04-07 15:24:25
295
原创 【Linux开发】04进程间通信方式之信号量(Semaphore)
信号量是一个特殊的整型变量P(sv)(荷兰语 Proberen,测试):如果sv > 0,将其减 1;如果sv == 0,则挂起当前进程(等待)。V(sv)(荷兰语 Verhogen,增加):如果有其他进程因等待sv而挂起,则唤醒其中一个;否则将sv加 1。这两个操作是原子操作——执行过程中不会被其他进程打断。函数作用生成一个 key创建或获取信号量集执行 P/V 操作(原子)控制信号量(设置/获取值、删除)
2026-04-07 14:35:47
334
原创 【Linux开发】03进程间通信方式之共享内存(Shared Memory)
共享内存属于机制之一(另外两个是消息队列和信号量)。使用key_t类型的键值来标识资源。使用xxxget函数创建或获取资源(shmgetmsggetsemget使用xxxctl函数控制资源(shmctlmsgctlsemctl使用函数附着/分离(共享内存用shmatshmdt共享内存是其中效率最高的 IPC,因为它没有内核到用户空间的数据拷贝。int which;// 0: 写进程可以写;1: 读进程可以读函数作用生成一个 key创建或获取共享内存映射共享内存到进程地址空间。
2026-04-07 14:23:21
543
原创 【Linux开发】02进程间通信方式之管道(FIFO)
FIFO也称为命名管道它在文件系统中有一个名字(路径),像一个普通文件一样存在(但内容是流动的数据)。不同的进程可以通过打开这个“文件”来读写数据,实现通信。数据在 FIFO 中也是先进先出的字节流。函数作用创建 FIFO 文件以只读方式打开(阻塞直到写端打开)以只写方式打开(阻塞直到读端打开)从 FIFO 读取数据向 FIFO 写入数据close(fd)关闭 FIFO 描述符删除 FIFO 文件。
2026-04-07 11:28:26
404
原创 【Linux开发】01进程间通信方式之管道(Pipe)
管道是操作系统提供的一块内存缓冲区(不属于任何进程的资源)。它有两个端口:读端(出口):从中读取数据写端(入口):向其中写入数据数据在管道中先进先出(FIFO),像一个队列。函数作用pipe(fds)创建管道,fds[0]读,fds[1]写从读端读取数据向写端写入数据close(fd)关闭文件描述符(端口)
2026-04-07 10:07:40
358
原创 【Linux开发】 Linux 信号处理——预防僵尸进程
名称本质触发时机典型用途Signal操作系统向进程发送的“软中断”。本质是异步通知,不携带额外数据,仅用一个整数标识事件。- 关键硬件/系统事件(如除‑0、非法指令)- 用户操作(Ctrl‑C、Ctrl‑Z)- 进程内部事件(子进程退出、定时器到期)- 处理异常(SIGFPE、SIGSEGV)- 实现超时/定时(SIGALRM)- 捕获用户中断(SIGINT)- 回收子进程(SIGCHLD)
2026-03-26 18:38:53
451
1
原创 【Linux开发】 05 Linux 多进程并发服务器
程序:存储在硬盘上的可执行文件,如a.out,它只是静态的指令集合。进程程序被加载到内存中运行后,就变成了进程,它是操作系统调度和资源分配的基本单位。程序 = 乐谱(写在纸上)进程 = 正在演奏的音乐(占用舞台、乐器)一个程序可以同时运行多个实例,产生多个进程。例如打开两个记事本,就会有两个进程。子进程终止后,操作系统会保留其一些信息(如退出状态),直到父进程主动读取。如果父进程一直不读取,子进程就会变成僵尸进程(Zombie),占用系统资源。函数作用fork()创建子进程waitpid()
2026-03-25 16:36:24
357
原创 【Linux开发】 04 Linux UDP 网络编程
写好地址,直接扔进邮筒,不保证对方一定能收到,也不需要提前建立连接。它简单、快速,适合对实时性要求高、对可靠性要求不高的场景(如视频直播、DNS查询)。UDP 不保证数据包能到达,也不保证顺序。如果发送速度过快,接收方来不及处理,也可能丢包。因此,在 UDP 编程中,你需要保证发送的数据包大小不超过接收方的缓冲区,通常建议小于 1500 字节(以太网 MTU 限制)。一个 UDP 套接字可以给多个不同地址发送数据,也可以接收来自任意地址的数据。隐式绑定了本地地址。:成功返回接收的字节数,失败返回 -1。
2026-03-25 15:03:32
374
原创 【Linux开发】03 TCP 网络编程中的数据边界问题与解决方案
先发送固定长度的元数据(操作数个数),接收方知道后续要读取多少数据。再发送固定长度的操作数(每个4字节)。最后发送固定长度的运算符(1字节)。服务器通过循环读取,确保收完所有数据后才进行计算,从而避免了粘包/拆包问题。TCP 是流式协议,没有消息边界,发送和接收的次数不一定匹配。为了可靠通信,必须自己定义消息边界,例如:定长消息长度前缀分隔符接收方必须循环读取,直到收到完整消息。
2026-03-25 14:19:54
381
原创 【Linux开发】 02 Linux TCP 网络编程——迭代、回声服务器
普通服务器TCP的缺点:启动一次服务程序,只能给一个客户端服务。迭代服务器while(1)new_fd = 服务器accept客户端的连接(new_fd = accept(listenfd, XX, XX))逻辑处理在这个new_fd上给客户端发送消息关闭new_fd也就是说,这个程序是一个一个处理各个客户端发来的连接的,比如一个客户端发来一个连接,那么只要它还没有完成自己的任务,那么它就一直会占用服务器的进程直到处理完毕后服务器关闭掉这个socket。可以循环服务多个客户端。回声服务器。
2026-03-25 11:31:37
393
原创 【Linux开发】 01 Linux TCP 网络编程——普通服务器
服务器:接电话的人(先装好电话,等待来电)客户端:打电话的人(知道对方号码,主动拨打)TCP:可靠的通话协议(确保对方能听到你说的话)步骤服务器客户端1socket()2bind()初始化地址结构3listen()connect()4accept()5write()read()write()6close()
2026-03-25 10:48:36
513
原创 【WIN开发】04 四种文件操作之注册表编程
注册表就是Windows系统的档案室!按 Win + R 键输入 regedit回车即可打开注册表编辑器。
2026-03-17 15:58:50
60
原创 【WIN开发】03 四种文件操作之Windows配置文件(INI文件)读写
想象你在填写一张个人信息表[个人信息] ← 节(Section)姓名 = 张三 ← 键值对(Key=Value)年龄 = 25城市 = 北京[兴趣爱好] ← 另一个节运动 = 篮球音乐 = 流行INI文件就是这种格式的配置文件!
2026-03-17 14:12:45
51
原创 【WIN开发】02 四种文件操作之Win32 API文件操作
别看它叫CreateFile,它不仅能创建文件,还能打开可以操作的对象举例文件文本文件、二进制文件管道命名管道、匿名管道邮槽进程间通信的邮槽通信资源串口、并口磁盘设备整个磁盘分区控制台命令行窗口目录文件夹一句话CreateFile是Windows系统的"万能开门器"!
2026-03-17 13:59:02
39
原创 【WIN开发】01 四种文件操作之C/C++文件操作
/ ANSI(窄字节) - 每个字符1字节// 英文字母没问题// 宽字节(Unicode) - 每个字符2字节wchar_t w[20] = L"中文Bingo";// 可以存中文。
2026-03-17 11:35:24
33
原创 【WIN开发】06进程间通信方式之WM_COPYDATA (最常用)
WM_COPYDATA就是Windows系统内置的"快递员"!SPY++是Visual Studio自带的一个工具,用来查看系统中的窗口信息。启动方法开始菜单 → Visual Studio文件夹 → Spy++ 工具或在VS中:工具 → Spy++
2026-03-17 11:17:34
32
原创 【WIN开发】05进程间通信方式之命名管道
特性匿名管道命名管道名字没有名字有固定名字(如方向单向双向(全双工)进程关系只能父子进程任意进程网络不能可以跨网络生命周期随进程结束可独立存在连接方式继承句柄通过名字连接。
2026-03-16 16:43:21
32
原创 【WIN开发】03进程间通信方式之邮槽
想象一个小区里的公共邮箱系统物业办公室:有一个总邮箱(服务端),只能从这里取信各家各户:有投信口(客户端),只能往里投信通信方向:单向的!只能从各家投到物业,物业不能回信邮槽(Mailslot)就是Windows系统的"公共邮箱"!
2026-03-16 15:01:20
42
原创 【WIN开发】03进程间通信方式之剪切板
A: 告诉Windows:这块内存可以移动。系统为了管理内存,可能会移动它,但我们用句柄操作,移动也不怕。A: 因为剪切板"接管"了这块内存,它会负责释放。剪切板还留着数据,供别人继续读。你只是"看"了一下。因为拿到的是句柄,不是直接指针。A: 因为剪切板内存需要被所有进程共享,必须用。A:先确认留言板上是不是有文本,万一是图片呢?
2026-03-16 10:40:28
254
原创 【WIN开发】02进程间通信方式汇总
进程间通信(IPC):让不同进程之间交换数据、互相通知的技术。打电话(Socket)递纸条(剪切板)传文件服务器(邮槽)内部通道(管道)喊一嗓子(消息)原理:通过网络IP和端口进行通信,可以在同一台电脑,也可以跨网络。// 进程A(服务器)// 进程B(客户端)特点✅ 跨网络通信✅ 稳定可靠(TCP)❌ 需要网络协议栈❌ 相对较慢适用场景:网络应用、分布式系统、客户端-服务器模式。
2026-03-15 18:16:44
38
原创 【WIN开发】01进程创建
子进程就是一个进程创建的另一个进程。父进程(总店)│├── 创建 → 子进程1(分店)│├── 创建 → 子进程2(分店)│└── 创建 → 子进程3(分店)
2026-03-13 16:38:07
53
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅