posix_sem_write.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 1024*4 /*共享内存的大小,建议设置成内存页的整数倍*/
#define FILENAME "shm.test"
int main(int argc,int *argv[])
{
/* 创建共享对象,可以查看/dev/shm目录 */
int fd = shm_open(FILENAME, O_CREAT | O_TRUNC | O_RDWR, 0777);
if (fd == -1) {
perror("open failed:");
exit(1);
}
/* 调整大小 */
if (ftruncate(fd, MAXSIZE) == -1) {
perror("ftruncate failed:");
exit(1);
}
/* 获取属性 */
struct stat buf;
if (fstat(fd, &buf) == -1) {
perror("fstat failed:");
exit(1);
}
printf("the shm object size is %ld\n", buf.st_size);
/* 建立映射关系 */
char *ptr = (char*)mmap(NULL, MAXSIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
perror("mmap failed:");
exit(1);
}
printf("mmap %s success\n", FILENAME);
close(fd); /* 关闭套接字 */
/* 写入数据 */
char buf1[1024] = {0};
printf("pls input the words....\n");
fgets(buf1,sizeof(buf1)-1,stdin);
strncpy(ptr, buf1, strlen(buf1));
sleep(30);
return 0;
}
posix_sem_read.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#define FILENAME "shm.test"
int main()
{
/* 创建共享对象,可以查看/dev/shm目录 */
int fd = shm_open(FILENAME, O_RDONLY, 0);
if (fd == -1) {
perror("open failed:");
exit(1);
}
/* 获取属性 */
struct stat buf;
if (fstat(fd, &buf) == -1) {
perror("fstat failed:");
exit(1);
}
printf("the shm object size is %ld\n", buf.st_size);
/* 建立映射关系 */
char *ptr = (char*)mmap(NULL, buf.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (ptr == MAP_FAILED) {
perror("mmap failed:");
exit(1);
}
printf("mmap %s success\n", FILENAME);
close(fd); /* 关闭套接字 */
printf("the read msg is:%s\n", ptr);
sleep(30);
return 0;
}
执行完write程序后,会在/dev/shm目录下生成一个shm.test
可以通过cat shm.test ,会输出对应的存储内容