SYSTEM V标准的共享内存用于进程间通信的权限管理示例

 

输出同现SEGMENTATION FAULT是因为试图写操作,这是因为将虚拟内存挂载为了READ ONLY方式导致的权限不够。

 1 #include <sys/shm.h>
 2 #include <unistd.h>
 3 #include <stdlib.h>
 4 #include <stdio.h>
 5 #include <sys/ipc.h>
 6 #include <string.h>
 7
 8 int main(int argc, char *argv[])
 9 {
10     key_t key;
11     int shm_id;
12     char *ptr;
13     key = ftok("/", 10);
14     shm_id = shmget(key, 100, IPC_CREAT | SHM_R);
15     printf("get the share memory id is %d\n", shm_id);
16     if((ptr = (char *)shmat(shm_id, NULL, SHM_RDONLY)) == NULL)
17     {
18         if(shmctl(shm_id, IPC_RMID, NULL) == -1)
19             perror("Failed to remove memory segment");
20             exit(EXIT_FAILURE);
21     }
22     printf("in yangzd the attach add is %p\n", ptr);
23     printf("Now ,try to write the memory.\n");
24     *ptr = 'd';
25     printf("*ptr = %c\n", *ptr);
26     shmdt(ptr);
27     shmctl(shm_id, IPC_RMID, 0 );
28 }

输出:
 ./shmat_rd_flag_regular
get the share memory id is 32769
in yangzd the attach add is 0xb7734000
Now ,try to write the memory.
Segmentation fault

查看当前系统的共享内存信息,可以看到新建的共享内存段:

 

 

时间: 2024-10-27 15:34:19

SYSTEM V标准的共享内存用于进程间通信的权限管理示例的相关文章

C++使用共享内存实现进程间通信

文件映射是一种实现进程间单向或双向通信的机制.它允许两个或多个本地进程间相互通信.为了共享文件或内存,所有的进程必须使用相同的文件映射的名字或是句柄. 为了实现共享文件,第一个进程先调用Createhttp://www.aliyun.com/zixun/aggregation/19352.html">File方法.接下来调用CreateFileMapping方法来创建一个文件映射对象.并为文件映射指明一个句柄和名称.由于事件,信号,互斥对象和文件映射等这些内核对象都共享同一个名字空间,所以

对System V命名信号量的封装类,用于进程/线程间互斥

最近为了对多进程互斥访问资源,采用System V的命名信号量,为了方便使用,对其用c++进行了封装,代码如下.AOSLock.hpp:#ifndef _AOSLOCK_HPP#define _AOSLOCK_HPP #include <sys/types.h>#include <sys/ipc.h>#include <sys/sem.h>#include <stdio.h>#include <errno.h>#include <stdli

System V 共享内存区

1.概述 系统调用mmap通过映射一个普通文件实现共享内存.System V 则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件.执行过程是先调用shmget,再调用shmat.对于每个共享的内存区,内核维护如下的信息结构,定义在<sys/shm.h>头文件中. 1 struct shmid_ds { 2 struct ipc_perm shm_perm; /* operation perms */ 3 int shm_

浅析Linux的共享内存与tmpfs文件系统

前言 共享内存主要用于进程间通信,Linux有两种共享内存(Shared Memory)机制: (1) ** System V shared memory(shmget/shmat/shmdt) ** Original shared memory mechanism, still widely used Sharing between unrelated processes. (2) ** POSIX shared memory(shm_open/shm_unlink) ** Sharing b

UNIX环境高级编程:System V 共享内存区

共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容.这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中.但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址. 共享内存的实现,分为两个步骤: a. 创建共享内存,使用 shmget 函数. b.

进程间通信之-共享内存Shared Memory--linux内核剖析(十一)

共享内存 共享内存是进程间通信中最简单的方式之一. 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区. 共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改. 关于共享内存 当一个程序加载进内存后,它就被分成叫作页的块. 通信将存在内存的两个页之间或者两个独立的进程之间. 总之,当一个程序想和另外一个程序通信的时候,那内存将会为这两个程序生成一块公共的

PHP 直接在共享内存中存储数据集

共享内存是一种在相同机器中的应用程序之间交换数据的有效方式.一个进程可创建一个可供其他进程访问的内存段,只要它分配了正确的权限.每个内存段拥有一个惟一的 ID(称为 shmid),这个 ID 指向一个物理内存区域,其他进程可在该区域操作它.创建并提供了合适的权限之后,同一台机器中的其他进程就可以操作这些内存段:读取.写入和删除. 这表明使用 C 语言编写的应用程序可与使用其他语言(比如 Java 或 PHP)编写的应用程序共享信息.它们都可以共享信息,只要它们可访问和理解该信息.共享内存在针对大

unix/linux共享内存应用与陷阱

共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区.在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区标识符数shmmni等,可以手工对其调整,但不推荐这样做. 一.应用 共享内存的使用,主要有以下几个API:ftok().shmget().shmat().shmdt()及shmctl(). 1)用ftok()函数获得一个ID号. 应用说明: 在IPC中,我们经常用用key_t的值来创建或者打开信号

Linux共享内存使用常见陷阱与分析

所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式.是针对其他通信机制运行效率较低而设计的.往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥.其他进程能把同一段共享内存段"连接到"他们自己的地址空间里去.所有进程都能访问共享内存中的地址.如果一个进程向这段共享内存写了数据,所做的改动会即时被有访问同一段共享内存的其他进程看到.共享内存的使用大大降低了在大规模数据处理过程中内存的消耗,但是共享内存的使用中有很多的陷阱,一不注意就很容易导致程序崩溃.