无亲缘关系进程间共享内存区的方法:
内存映射文件(memory-mapped file),有open函数打开,由mmap函数把得到的描述符映射到当前进程地址空间的一个文件。共享内存对象(shared-memory object),由shm_open打开一个POSIX ipC名字(路径名),所返回的描述符由mmap函数映射到当前进程的地址空间。POSIX把两者合称为内存区对象(memory object)。处理mmap时,可以调用ftruncate函数对普通文件或共享内存对象的大小修改。
#include <unistd.h>#include <sys/types.h>int ftruncate(int fd, off_t length);//返回值:若成功则为0,若出错,返回-1打开一个存在的共享内存区对象时,可以调用fstat来获取有关该对象的信息。
S#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int fstat(int fd, struct stat *buf);//返回值:若成功,返回0,若出错则为-1stat结构有12个以上成员,当fd指代一个共享内存区对象时,只含有四个成员信息。
struct stat { mode_t st_mode; /* PRotection */ nlink_t st_nlink; /* number of hard links */ uid_t st_uid; /* user ID of owner */ gid_t st_gid; /* group ID of owner */ };运行结果:
➜ shm_open ./shm_open shm_open succsize = 36, mode = 664//mode为664是因为有umask掩码是002然后可以在/dev/shm
目录中查看到xyz文件
运行结果:
➜ shm_open ./shm_writesize = 36, mode = 664➜ shm_open ./shm_read size = 36, mode = 664name = test, age = 20//读出和写入相同,或者可以用od命令查看文件内容➜ shm od -c -A d /dev/shm/xyz0000000 t e s t /0 /0 /0 /0 /0 /0 /0 /0 /0 /0 /0 /00000016 /0 /0 /0 /0 /0 /0 /0 /0 /0 /0 /0 /0 /0 /0 /0 /00000032 024 /0 /0 /00000036新闻热点
疑难解答