96SEO 2026-02-20 09:07 0
href="https://www.cnblogs.com/ljbguanli/p/19620453"

aria-level="2">深入解析:【Linux】零基础学习命名管道-共享内存
xmlns="http://www.w3.org/2000/svg"> style="-webkit-tap-highlight-color: class="toc">d="M5,0
rgba(0,
文章目录
匿名管道有一个缺点,就是只能血缘间通信,而我们想要让两个毫不相干的进程进行通信,就要用到命名管道,
id="_4">存储
要两个毫不相干的进程通信,首先要看到同一个管道文件,命名管道如何做到的呢?
同一路径下的同一文件名,文件路径具有唯一性
所以,命名管道存储在文件系统中,有自己的文件路径和inode,但是不会向磁盘中刷数据,数据传输发生在内存级缓冲区中,
所以,纯内存级缓冲区的通信方法有:
匿名管道,共享内存,消息队列
id="_11">命令行创建
1,命名管道可以直接在命令行创建:
mkfifo
“管道名”
src="https://i-blog.csdnimg.cn/direct/a3307a70d9f9466584d1ec5df809e041.png">
可以看到我创建了一个管道,向里面写入!
src="https://i-blog.csdnimg.cn/direct/19fd63833fe345a88c6c43738d4e45bc.png">
可以看到卡住了,那是因为卡在文件缓冲区了,我没有读取
src="https://i-blog.csdnimg.cn/direct/1d073a875a9e44658d09333c824ae60d.png">
并且我们查看文件大小,发现还是0,说明没刷盘,读取之后结束
删除管道用unlink,
id="mkfifo_29">mkfifo函数实现通信
函数:
int
mkfifo(const
mode);
用函数实现两个进程通信
头文件:封装类,完成命名管道初始化和清理
string"><iostream>
class="token
string"><sys/types.h>
class="token
string"><sys/stat.h>
class="token
string"><unistd.h>
class="token
string"><fcntl.h>
class="token
string"><string.h>
class="token
string"><stdio.h>
class="token
string">"./myfile"
class="token
number">0664
class="token
punctuation">{
FIFO_CREAT_FILEclass="token
punctuation">,
FIFO_DELETE_FILEclass="token
punctuation">,
FIFO_OPEN_FILEclass="token
punctuation">{
publicclass="token
punctuation">(
FIFO_FILEclass="token
punctuation">(
FIFO_CREAT_FILEclass="token
punctuation">(
FIFO_FILEclass="token
punctuation">(
FIFO_DELETE_FILEclass="token
punctuation">;
==读端:打开文件即可,要是写端没准备好,我们还需要等写端打开,==不断写入,如果x=0,说明写端关闭了,那我也关闭
string">"commen.h"
using
punctuation">(FIFO_FILE
class="token
punctuation">,
O_RDONLYclass="token
operator"><<
endlclass="token
punctuation">(
FIFO_OPEN_FILEclass="token
punctuation">,
bufferclass="token
punctuation">(
bufferclass="token
operator"><<
bufferclass="token
operator"><<
endlclass="token
punctuation">(
errnoclass="token
punctuation">,
errnoclass="token
punctuation">}
写端:打开文件,从键盘上获取字符串,写入文件
string">"commen.h"
using
punctuation">(FIFO_FILE
class="token
punctuation">,
O_WRONLYclass="token
punctuation">(
FIFO_CREAT_FILEclass="token
operator"><<
endlclass="token
operator"><<
endlclass="token
punctuation">}
src="https://i-blog.csdnimg.cn/direct/3aa84adf8be2443ab3d7a6505faff990.png">
src="https://i-blog.csdnimg.cn/direct/15ae89e0771d45b3adfc3c87581090f8.png">
操作系统在物理内存中开辟一块物理内存,供两个进程交流,
操作系统中肯定有很多共享内存,操作系统肯定要管理,先描述再组织
要释放一个共享内存,先去关联再释放
注意:
2,共享内存通信速度最快(因为他拷贝最少)
3,共享内存数据都由用户自己控制
上代码:
shmgetint
shmget(key_y
shm***);
int
key:具有唯一性,保证进程能找到
shm***:如何设置共享内存,O_CREAT没有就创建,有就打开
O_EXIT,没有就创建,有返回错误
O_EXIT
shmid(shmget返回值)区别
key:操作系统内标定唯一性
shmid:只在你的进程,用来表示资源唯一性
学习key
2,第一个进程设置key,第二个进程拿着相同的key就能找到相同位置
3,key存在哪里?
共享内存结构体中
?
函数
key_t
ftok(const
pathname是用户自己定义的路径/home/jib,id也是用户自己指定的
共享内存生命周期是随内核的,也就是用户不关闭,共享内存会一直存在,除非内核重启
共享内存查看:
-m
共享内存删除:ipcrm
src="https://i-blog.csdnimg.cn/direct/4138293ea9494d7a8f3a9596d974328c.png">
nattch,表示哪个进程关联到此共享内存
id="shmat_180">shmat
void
*shmat(int
shm***);
功能:将共享内存关联到进程中,,
shmid:共享内存的标识符
shmaddr:一般设置nullptr,核心自动选择地址
读写权限
int
*shmaddr);
功能:将进程去关联
共享内存起始地址
注意去关联,不代表释放共享内存
id="shmctl_197">shmctl
功能:控制共享内存
int
shmctl(int
*buf);
cmd有3个动作
src="https://i-blog.csdnimg.cn/direct/698c00da0a234b3bbc00a275664dca20.png">
id="_203">
实现共享内存共享内存没有同步机制,也就是我们写入时,不会自动清理缓存区,就会一直打印重复数据
所以我们加了管道,通知读端
string"><iostream> string"><string.h> string"><sys/types.h> string"><sys/ipc.h> string"><sys/shm.h> string"><unistd.h> string"><sys/shm.h>class="token
class="token
class="token
class="token
class="token
class="token
comment">//共享内存给的是4096整数倍字节大小, 4097,给你的其实是4096*2,但是你访问4098又会报错 string">"/home/jib" punctuation">( punctuation">, function">GetShareMemHelper punctuation">( function">Createshm function">GetShareMemHelper punctuation">( function">GetShareMemHelper punctuation">( string"><sys/stat.h> string"><unistd.h> string"><fcntl.h> string"><stdio.h> string">"./myfile" number">0664 punctuation">{ punctuation">, punctuation">, punctuation">{ punctuation">( punctuation">( punctuation">( punctuation">( punctuation">;class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
server.cc
string">"commen.hpp"
string">"log.hpp"
function">Createshm punctuation">( punctuation">, punctuation">( punctuation">, operator">| punctuation">( punctuation">( punctuation">, punctuation">( operator"><< operator"><< punctuation">( operator">& punctuation">.class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
punctuation">.
shm_permpunctuation">.
__keypunctuation">.
shm_permpunctuation">(
shmaddrpunctuation">(
shmidpunctuation">,
IPC_RMIDpunctuation">,
nullptrpunctuation">}
client.cc
string">"commen.hpp"
string">"log.hpp"
punctuation">(shmid punctuation">, punctuation">( punctuation">, punctuation">( punctuation">( punctuation">, punctuation">( punctuation">( punctuation">( punctuation">}class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="token
class="post-meta-container">
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback