shmget创建共享内存errno - ipcs - From

2024-02-10 19:48

本文主要是介绍shmget创建共享内存errno - ipcs - From,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Thanks to: https://blog.csdn.net/libaineu2004/article/details/76919711

今天编写的程序,要使用一个共享内存,共享内存是由别的进程创建并初始化,我这边负责将内存attach 到我的进程空间里,在调用函数 shmget 的时候报错了

    今天编写的程序,要使用一个共享内存,共享内存是由别的进程创建并初始化,我这边负责将内存attach 到我的进程空间里,在调用函数 shmget 的时候报错了int shmid = shmget((key_t)key,size,0);if(shmid == -1 ){perror("shmget error:");return NULL;}else{return shmat(shmid,0,0);}

errno = 22 Invalid argument

然后就是查找问题,花了大半天都没找到问题,最后重启机器好了,经过我的思考与查找,我认为有2个原因导致的。

  1. 程序编译的时候,打开的共享内存必须先关闭,也就是说在编译带有共享内存程序的时候,必须先在终端使用命令ipcrm 掉使用的share memery,因为创建共享内存的程序已经在运行,我的程序必须要attch这块共享内存,因此编译出来,可能导致错误。
  2. 共享内存的结构被修改,也就是说创建的共享内存结构和你将要attch 之后的共享内存结构不一致导致的,创建共享内存程序的大小,比我的程序要使用的共享内存要小,虽然shmid都是一样,但是大小比创建的大,这肯定是有问题,因为我的程序结构比创建程序使用的结构要多2个结构体,因此这个会导致程序无效的参数。

写这两点,为铭记我查找半天代码的代价,传到博客,供大家共享,以避免重走我的老路,为无谓的错误浪费大量时间。

具体的用法总结如下:

1、显示所有的IPC设施

ipcs -a

2、显示所有的消息队列Message Queue

ipcs -q

3、显示所有的信号量

ipcs -s

4、显示所有的共享内存

ipcs -m

5、显示IPC设施的详细信息

ipcs -q -i id

id 对应shmid、semid、msgid等。-q对应设施的类型(队列),查看信号量详细情况使用-s,查看共享内存使用-m。

6、显示IPC设施的限制大小

ipcs -m -l

-m对应设施类型,可选参数包括-q、-m、-s。

7、显示IPC设施的权限关系

ipcs -c

ipcs -m -c

ipcs -q -c

ipcs -s -c

8、显示最近访问过IPC设施的进程ID。

ipcs -p

ipcs -m -p

ipcs -q -p

9、显示IPC设施的最后操作时间

ipcs -t

ipcs -q -t

ipcs -m -t

ipcs -s -t

10、显示IPC设施的当前状态

ipcs -u

Linux上的ipcs命令,不支持UNIX上的-b、-o指令,同样UNIX中不支持-l、-u指令,所以在编写跨平台的脚本时,需要注意这个问题。

[root@localhost ~]# ipcs -a------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    ------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 196608     root       600        524288     2          dest         
0x00000000 229377     root       600        4194304    2          dest         
0x00000000 327682     root       600        4194304    2          dest         
0x6f000af7 622595     root       666        204000     0                       
0x00000000 458756     root       600        393216     2          dest         
0x51006ce5 491525     root       600        1024       1                       
0x00000000 524294     root       600        5674396    2          dest         
0x00000000 557063     root       600        4194304    2          dest         ------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x510014fb 65536      root       600        1         
0x0b000af7 98305      root       666        1         [root@localhost ~]# ipcrm -m 622595

————————————————
版权声明:本文为CSDN博主「libaineu2004」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/libaineu2004/article/details/76919711

这篇关于shmget创建共享内存errno - ipcs - From的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697921

相关文章

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Macos创建python虚拟环境的详细步骤教学

《Macos创建python虚拟环境的详细步骤教学》在macOS上创建Python虚拟环境主要通过Python内置的venv模块实现,也可使用第三方工具如virtualenv,下面小编来和大家简单聊聊... 目录一、使用 python 内置 venv 模块(推荐)二、使用 virtualenv(兼容旧版 P

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Java 如何创建和使用ExecutorService

《Java如何创建和使用ExecutorService》ExecutorService是Java中用来管理和执行多线程任务的一种高级工具,可以有效地管理线程的生命周期和任务的执行过程,特别是在需要处... 目录一、什么是ExecutorService?二、ExecutorService的核心功能三、如何创建

使用Python创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti