linux 进程 共享内存,linux进程通讯-共享内存

Linux共享内存的实现依赖于共享内存文件系统,该文件系统通常装载在/dev/shm,在调用shm_open系统函数的时候,会在/dev/shm/目录下生成mymem文件.

而后程序调用shm_unlink删除mymem,这里如果卸载掉/dev/shm挂载点会怎么样呢?

查看分区信息

df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda1 19G 973M 17G 6% /

tmpfs 253M 0 253M 0% /lib/init/rw

udev 10M 88K 10M 1% /dev

tmpfs 253M 0 253M 0% /dev/shm

卸载/dev/shm

umount /dev/shm/

./posix-shm &

child wrote 0xdeadbeef

[1] 15476

ls -l /dev/shm/mymem

-rw-r--r-- 1 root root 4096 2010-10-26 14:25 /dev/shm/mymem

我们看到shm_open只是在/dev/shm下创建文件.而不管/dev/shm是否是用tmpfs类型挂载的分区.

如果删除/dev/shm呢?

rmdir /dev/shm

再次执行posix-shm

./posix-shm &

child wrote 0xdeadbeef

此时程序找不到/dev/shm,而在/dev/目录下建立共享内存文件

ls -l /dev/mymem

-rw-r--r-- 1 root root 4096 2010-10-26 14:29 /dev/mymem

三)System V共享内存 API

1)System V API广泛应用于X windows系统及其扩展版本中,许多X应用程序也使用它.

2)shmget:创建一个新的共享区域或者附加在已有的共享区域上(同shm_open).

3)shmat:用于将一个文件映射到内存区域中(同mmap).

4)shmdt:用于释放所映射的内存区域(同munmap)

5)shmctl:对于多个用户,断开其对共享区域的连接(同shm_unlink)

源程序2:

#include

#include

#include

#include

#include

#include

#include

void error_out(const char *msg)

{

perror(msg);

exit(EXIT_FAILURE);

}

int main (int argc, char *argv[])

{

key_t mykey = 12345678;

const size_t region_size = sysconf(_SC_PAGE_SIZE);

int smid = shmget(mykey, region_size, IPC_CREAT|0666);

if(smid == -1)

error_out("shmget");

void *ptr;

ptr = shmat(smid, NULL, 0);

if (ptr == (void *) -1)

error_out("shmat");

pid_t pid = fork();

if (pid == 0){

u_long *d = (u_long *)ptr;

*d = 0xdeadbeef;

exit(0);

}

else{

int status;

waitpid(pid, &status, 0);

printf("child wrote %#lx\n", *(u_long *)ptr);

}

sleep(30);

int r = shmdt(ptr);

if (r == -1)

error_out("shmdt");

r = shmctl(smid, IPC_RMID, NULL);

if (r == -1)

error_out("shmdt");

return 0;

}

gcc sysv-shm.c -o sysv-shm -lrt

./sysv-shm

child wrote 0xdeadbeef

程序分析:

1)shmget函数使用的key_t变量在功能上等价于shm_open使用的文件名,由shmget返回的smid在功能上等价于shm_open返回的文件描述符.

2)不同于POSIX API所创建的内存区,System V API创建的内存区在任何文件系统中都是不可见的.

3)可以用ipcs管理System V API共享内存.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值