IO进程—进程间的通信—共享内存具体函数操作

news2024/11/25 10:42:51

创建唯一key值—— ftok

key_t ftok(const char *pathname, int proj_id);

#include <sys/types.h>

#include <sys/ipc.h>

功能:

ftok函数是用于生成一个键值(key_t类型)的函数,这个键值通常用于进程间通信(IPC)机制,如消息队列、共享内存和信号量等

参数:

pathname:指定的文件路径名或目录路径名,该文件必须存在且可以访问。

proj_id:子序号,是一个8位整数,范围是0到255

返回值:

成功:key值

失败:-1

#include<sys/ipc.h>
#include<sys/types.h>
int main
{
key_t key;

const char *pathname="/dev/fd/0";//指定一个存在的文件路径
int proj_id=123;//子序号
key=ftok(pathname,proj_id);
if(key==-1)
{perror("ftok err");return -1;}
return 0;
}

补充:

key值是根据pathname的inode号和proj_id的低8位组合而成的。如:0x610109a9

pathname只要是路径中存在的文件即可

创建或共享内存——shmget

int shmget(key_t key, size_t size, int shmflg);

参数:

key:这是共享内存的键值:ftok()函数生成一个唯一的键值。

key的值为IPC_PRIVATE,则会创建一个新的共享内存段;

key的值为0且在参数shmflg中设置了IPC_PRIVATE标志,则同样会创建一个新的共享内存段。

size:指定需要创建或获取的共享内存大小。该大小会被四舍五入到页面大小的倍数。size_t是一种无符号整数类型,用于表示对象的大小或数组的索引,其大小取决于平台和编译器。

shmflg共享内存的访问权限控制和其他选项。

返回值:

  • 成功:shmid共享内存id(非负整数)
  • 失败:返回-1,并设置相应的错误码

查看创建的共享内存的命令:ipcs -m

#include<sys/ipc.h>

#include<string.h>
int main()
{

const char *pathname = "/etc/config"; // 选择一个存在的文件路径
int proj_id=1;//设置项目ID
key_t key=ftok(pathname,proj_id);
if(key==-1)
{perror("ftok failed"); return -1;}
return 0;
///使用生成key进行进程间通信操作
}
  • 在上述示例中,我们通过调用ftok()函数将指定的文件路径和项目ID转换成一个唯一的键值
  • 注意事项:
  • 确保所选的文件路径确实存在,并且进程具有对该文件的访问权限。
  • proj_id应选择一个较小的正整数,以避免与其他程序冲突

映射共享内存——shmat

void *shmat(int shmid,const void *shmaddr,int shmflg);

参数:

shmid:

共享内存id号

shmaddr附加地址

一般NULL,则由系统自动选择一个合适的页面对齐地址来附加共享内存段。

如果shmaddr不为NULL,对用户指定地址进行附加

shmflg

这是共享内存段的访问权限和映射条件。常见的标志包括:SHM_RDONLY:只读模式。

返回值:

成功:指向共享内存起始地址的指针

失败:返回-1,并设置相应的错误号(void*)-1;

//映射/
char *p= shmat(shmid,NULL,0);
if(p==(void*)-1)
{perror("shmat err");return -1;}
//向共享内存中存放数据
strcpy(p,"world");//shuru
scanf("%s",p);//shuru

printf("%s",p);//shuchu
return 0;

取消映射——shmdt

int shmdt(const void *shmaddr);

参数:要取消的地址

返回值:

成功0;

失败:-1;

shmdt(p);//取消映射
getchar();//阻塞的作用

删除共享内存——shmctl

int shmctl(int shmid,int cmd,struct shmid_ds *buf);

功能:

删除共享内存

参数:

shmid:共享ID

cmd:指定要执行的操作命令:IPC_STAT获取当前共享内存的状态信息,并将这些信息存储在由 buf 指向的结构中。IPC_SET根据 buf 中的参数修改共享内存的属性,如拥有者、组和权限等。IPC_RMID删除(释放)指定的共享内存段。

buf:NULL

结构体的指针,该结构体定义在 <sys/shm.h> 头文件中。该结构体包含共享内存的各种状态和权限信息。

返回值:

  • 成功时返回 0。
  • 失败时返回 -1,并设置相应的错误代码
    #include <sys/ipc.h>
    #include <sys/shm.h>
    
    int main() {
    key_t key = ftok("example", 65); // 创建一个键值
    int shmid = shmget(key, 1024, 0666 | IPC_CREAT); // 获取共享内存标识符
    
    if (shmid == -1) {
    perror("shmget failed");
    return 1;
    }
    
    struct shmid_ds ds;
    if (shmctl(shmid, IPC_STAT, &ds) == -1) {
    perror("shmctl failed");
    return 1;
    }
    
    printf("共享内存大小: %lu\n", ds.shm _segsz);
    printf("共享内存权限: %o\n", ds.shm _perm模式);
    
    shmctl(shmid, IPC_RMID, NULL); // 删除共享内存
    
    return 0;
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1986116.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人像修复-通道磨皮

文章目录 原理步骤建立动作一键操作 原理 皮肤看起来比较脏的原因&#xff1a;光影过渡不均匀 步骤 在通道中&#xff0c;找到明暗反差最大的通道&#xff0c;复制一层通道 在复制通道中&#xff0c;用高反差保留&#xff0c;把画面中反差较大的部分保留出来&#xff0c;半…

解决使用Navicat连接数据库时,打开数据库表很慢的问题

今天使用Navicat连接数据库时&#xff0c;发现不管表中数据多少&#xff0c;打开数据库表非常慢。 解决方法&#xff1a; Navicat - 右键编辑数据库连接 - 高级 - 勾选保持连接间隔 - 输入框设置为20 - 点击确定&#xff01; 参考文章&#xff1a;https://51.ruyo.net/14030.…

【ARM】v8架构programmer guide(2)_处理器及V8基础

目录 2.1 ARMv8-A 3. ARMv8的基础 普通世界&#xff08;Non-secure state&#xff09;的特权组件&#xff1a; 安全世界&#xff08;Secure state&#xff09;的特权组件&#xff1a; 安全监视器&#xff08;Secure Monitor&#xff09;&#xff1a; 3.1 execution state…

实现高级社会的构想-基于人工智能模式

实现高级社会(共产主义)的构想 刚过完劳动节,劳动最光荣.在新质生产力思想启发下,我想探讨的是我们当下能否从资本主义或社会主义进入或构建高级社会(共产主义社会)呢?高级社会(共产主义),我的理解可以用平均主义来无限接近,即使政策上无法做到平均分配&#xff0c;也可以通过…

lvs的nat模式配置

lvs的nat模式 准备工作 lvs主机需要两个网络适配器&#xff0c;其中一个为NAT模式&#xff0c;另外一个为仅主机模式&#xff0c;还需要两个server主机&#xff0c;一个为server1还有一个为server2&#xff0c;都为仅主机模式 配置过程 配置ip lvs主机 [rootlvs ~]# cat /…

项目中引入RedisTemplate和Redisson时RedisTemplate无法使用zset问题(栈溢出stackOverflow)深入源码分析解决

文章目录 项目中引入RedisTemplate和Redisson时RedisTemplate无法使用zset问题&#xff08;栈溢出stackOverflow&#xff09;深入源码分析解决依赖信息报错信息与分析解决办法 项目中引入RedisTemplate和Redisson时RedisTemplate无法使用zset问题&#xff08;栈溢出stackOverfl…

utf-8‘ codec can‘t decode byte 0xd3 in position

1.背景 安装psycopg2-binary&#xff0c;安装命令“pip install psycopg2-binary2.9.7” 完整报错信息如下&#xff1a; (venv) PS D:\workspace_all\pyCharm\MaxKB-main> pip install psycopg2-binary2.9.7 Looking in indexes: https://mirrors.ustc.edu.cn/pypi/web/s…

Python语法重温1

最近做项目的时候&#xff0c;有时总得愣一下语法。所以决定来温习一下。。。 温故而知新&#xff0c;谁都没办法说自己经历时间的流逝后还能时刻记得&#xff0c;希望能帮到你们 列表的替换 如果超出列表元素则会报错。 列表末尾的追加 插入列表操作 可以超出列表之外插入 删…

常见中间件漏洞复现之【WebLogic】!

Weblogic介绍 WebLogic是美国Oracle公司出品的⼀个application server&#xff0c;确切的说是⼀个基于JAVAEE架构的中间件&#xff0c;默认端⼝&#xff1a;7001 WebLogic是⽤于开发、集成、部署和管理⼤型分布式Web应⽤、⽹络应⽤和数据库应⽤的Java应⽤服务器。将Java的动态…

“炎”值加码,数据机房“中暑“罢工,怎么破?

又是热到汗流浃背、头晕脑胀的一天…江浙沪等地正在经历今年来最强高温“烤验”&#xff01;没有最热&#xff0c;只有更热&#xff0c;40摄氏度的高温好像越来越多了&#xff01;最近东北货车司机热到报警&#xff0c;获救后怒赞“杭州人好啊&#xff01;”&#xff0c;“先坐…

DataX迁移数据到StarRocks超大表报too many version问题记录

目录 1 背景说明 2 问题描述 3 解决思路 3.1 磁盘问题 3.2 DataX配置 3.3 分桶设置 3.4 增量迁移 1 背景说明 项目上有两张大表&#xff0c;数据量在300w左右&#xff0c;每天凌晨通过datax将前一天最新的全量户数迁移到StarRocks对应的分区表中。分区表设置的动态分区&a…

SpringBoot 集成原生 Servlet、Filter、Listener

注解方式集成 Servlet、Filter、Listener 启动类添加 ServletComponentScan 注解 SpringBootApplication ServletComponentScan public class BlogApplication {public static void main(String[] args) {SpringApplication.run(BlogApplication.class);} } 创建 Servlet &a…

免费的会声会影软件哪款拥有最强性能

会声会影2024&#xff1a;引领视频创作新时代的创新之旅** 在数字时代的浪潮中&#xff0c;视频创作已成为连接世界、表达创意的重要方式。随着技术的不断进步&#xff0c;一款名为“会声会影2024”的视频编辑软件横空出世&#xff0c;它不仅继承了前代产品的优秀传统&#xf…

java集成onlyoffice实现文档在线预览编辑

一、onlyoffice是什么 ONLYOFFICE是一款由Ascensio System SIA公司开发的在线办公软件套件&#xff0c;它提供了文档编辑、电子表格、演示文稿和表单等多种办公工具&#xff0c;旨在提高团队协作效率和文档处理的便捷性。以下是关于ONLYOFFICE的详细介绍&#xff1a; 1、软件…

2024年7月30日(nginx 代理 负载均衡 jdk )

一、nginx代理 1、动态服务器 修改index.html文件&#xff0c;并且发布web项目 当前这台主机1动态服务器&#xff0c;后端服务器对标Java服务器&#xff0c;由于没有部署tomcat&#xff0c;所以使用nginx代理 [rootlocalhost ~]# echo "this is web server" > /u…

C++入门 | auto关键字、范围for、指针空值nullptr

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;C专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ C入门 | auto关键字、范围for、指针空值nullptr 文章编号&#xff1a;C …

原神升级计划数据表:重新布局,优化代码

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>原神升级计划数据表</title><style>* {margin: 0;padding: 0;box-sizing: border-box;body {background: #0b1b2c;}}header {width: 10…

Java斗地主--index1 (0801)

今天遇到一个很有意思的游戏–斗地主&#xff0c;那么下面就开始实现斗地主啦&#xff01;&#xff01;&#xff01; package Demo_YY;public class PockerIndex {public static void main(String[] args) {start();}public static void start(){String pocker[] new String[…

C语言中整数类型及其类型转换

1.数据的存储和排列 是的&#xff0c;在C语言中&#xff0c;整数类型通常以补码&#xff08;twos complement&#xff09;形式存储在内存中。这是因为补码表示法在处理有符号整数的加减运算上更为简便和高效。 基本类型所占字节数&#xff1a; 大端方式存储 就相当于我们平时的…

Android 自定义View(二):画布、画笔、路径(遮罩)以及Sufaceview

目录 1&#xff09;画布是什么&#xff1f;画布如何使用&#xff1f; 2&#xff09;画笔是什么&#xff0c;画笔如何生成呢&#xff1f; 3&#xff09;如何画圆、画文字、画矩形 4&#xff09;路径&#xff08;Path&#xff09;遮罩 5&#xff09;Sufaceview&#xff08;使用…