Articles of 共享内存

Ashmem保留政策

所以在Android上,既没有POSIX共享内存,也没有SysV共享内存,但是还有ashmem 。 我想用它从本地子系统中的崩溃中收集一些事后的信息(如在这里 )。 问题 – 当处理他们的过程死亡时,我可以让一个灰烬区域持续吗? ashmem在哪里logging?

共享内存使用信号量进行安全写入

下面的Server代码把一个string转换成共享内存variables。 客户端代码显示共享内存中可用的string。 完整的代码: 可在这个github链接 Server.c int main(int argc, char *argv[]) { /* code to create posix shared memory and posix named semaphore */ /* critical section start */ snprintf(shared_msg->content, MAX_MSG_LENGTH, "%s", argv[1]); /* critical section end */ } Client.c int main(int argc, char *argv[]) { /* code to open posix shared memory and posix named […]

防止截断共享映射文件?

我有两个通过共享内存进行通信的进程。 一个是特权和可信的,另一个是LXC过程,不受信任。 可信进程在LXC进程可以访问的目录中创build一个文件。 它将其设置为固定的尺寸。 现在它将这个文件与不受信任的进程共享,它们都将它们映射为read + write。 我希望不受信任的进程能够读写映射,这是安全的,因为可信进程不会对已写入的内容做任何假设,并且仔细validation它。 但是,对于写入访问,不受信任的进程可以将文件转换为零(由于挂载限制,不能增加文件的大小),这会在特权进程中产生一个SIGBUS(我确认了这一点)。 由于有许多不可信的进程与可信进程进行通信,这基本上是对整个系统的拒绝服务攻击,而Linux允许进行这种攻击。 有什么办法可以防止这个? 我可以拒绝访问ftruncate,但可能会有其他系统调用来做同样的事情。 当然,有一种方法可以让一个进程写入一个文件,但不能调整它的大小或重命名它,或做任何其他的元数据更改? 我能想到的最好的办法就是回退到陈旧的System V共享内存,因为这在Linux上根本无法resize(甚至没有经过精心devise的过程)。

为什么关于mmap的代码在(16384 + 1)字节而不是(4096 + 1)字节处得到段错误?

操作系统是Ubuntu。 在我看来,页面大小为4096,在第(4096 + 1)字节处应该得到段错误,但是在写入(16384 + 1)字节时得到段错误。 输出:… 16383一个分段错误 #include <sys/mman.h> // memory management. #include <sys/stat.h> // file stat. man 2 stat #include <fcntl.h> // O_CREAT #include <unistd.h> #include <errno.h> #include <stdio.h> int main(int argc, char* argv[]) { const int page_size = getpagesize(); printf("page_size: %d\n", page_size); int shm_fd = open("shm.temp", O_CREAT | O_RDWR, S_IRWXU); ftruncate(shm_fd, 1); […]

谁可以在Linux共享共享内存?

我正在加强学生代码执行的沙箱。 我觉得我很满意,学生们不能共享文件系统或信号上的数据,因为我发现明确的规则指出这些数据,他们作为不同的非特权用户执行。 然而,我正在很难查看文档来确定什么时候创build共享内存(或更一般的IPC – 队列或信号量),谁可以看到。 如果你创build共享内存,任何人都可以在同一台机器上打开它,或者有什么办法来控制它? 控制是在创build内存的程序中,还是由系统pipe理员限制?

为什么C中的全局数组(初始化)不能完全算作PSS

envirenment:gcc版本4.8.4(Ubuntu 4.8.4-2ubuntu1〜14.04)3.16.0-30-generic#40〜14.04.1-Ubuntu SMP Thu Jan 15 17:45:15 UTC 2015 i686 i686 i686 GNU C代码a2.c:有一个40MB的全局数组,每个项目都被分配。 int b[10000000];//40M global array void main() { int i = 0; for(i = 0; i<10000000; i++) {b[i]=i;} while(1); } 我build立像gcc -o a2 a2.c 当我运行这个代码,看到smap文件cat /proc/25739/smaps ,内容如下 08048000-08049000 r-xp 00000000 08:11 46930087 /home/jzd/test/a2 Size: 4 kB Rss: 4 kB Pss: 4 kB […]

二维数组与共享内存

我有2个程序使用共享内存块相互通信。 第一个程序从命令行获取一个参数并分叉指定的次数,每个subprocessID和一个随机生成的数字被存储在一个2D数组中,然后应该通过附加存储器传递给第二个程序块。 问题是我不知道如何做到这一点,并会感谢一些帮助,因为我是一个新手当谈到这一点。 以下是目前为止的第一个程序的代码,已完全testing并正在运行: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/wait.h> #include <unistd.h> #include <time.h> int main(int argc, char *argv[]) { if (argc < 2) { printf("\nError with command line argument!\n"); exit(1); } /* Program is simulation of a printer queue, forked child processes act as jobs in the queue […]

在Linux中为shm_open打印errno时发生分段错误

我在C语言中练习使用共享内存,下面是一个简单例子的代码: #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <errno.h> #define SIZE_OF_MEMORY sizeof(int) #define SHARED_MEMORY_NAME "GDM123456" int main() { int shm_fd = shm_open(SHARED_MEMORY_NAME, O_RDWR | O_CREAT | O_EXCL, 0777); if(shm_fd == -1) { printf("failed to open shared memory\n"); printf("shm_open error, errno(%d): %s\n", errno, strerror(errno)); […]

这个“共享内存”IPC对象被删除了吗?

可能重复: 在Linux中用ipcrm删除共享内存 我正在运行Fedora 15 64位。 我有一些没有被进程清理的共享内存。 当你调用ipcs -m时,你可以看到共享内存: —— Shared Memory Segments ——– key shmid owner perms bytes nattch status 0x51012a29 294919 trevor 666 194400 2 当我调用ipcrm -m 294919 ,然后检查共享内存是否被删除时,您会看到: —— Shared Memory Segments ——– key shmid owner perms bytes nattch status 0x00000000 294919 trevor 666 194400 2 dest 国际海事组织的共享内存仍然存在…因为它出现时,我打电话ipcs -m 。 这个共享内存是否真的被删除?

Linux:常规和特权进程之间的mmap MAP_SHARED好吗?

我想要一个在限制用户下运行的进程与一个守护进程共享一个futex,这个守护进程基本上是root用户,可以放弃一些权限。 通常的shm_open和mmap等是否可以与以不同用户运行的进程一起工作,并具有不同的权限? 有什么具体的安全问题,如果有的话(我怎么减轻他们,权限也许)? 这两个过程中的哪一个创buildfd有什么区别?