Linux下的共享内存(03)---通过指针访问共享内存中的数据

来源:互联网 发布:java环境变量设置作用 编辑:程序博客网 时间:2024/06/05 01:55

环境:Vmware Workstation;CentOS-6.4-x86_64

说明:

1、将共享内存挂载至进程:void  *shmat(int  shmid, const void *shmaddr,int shmflg);

参数shmid是要附加的共享内存区标示符。
总是把参数shmaddr设为0。
参数shmflg可以为SHM_RDONLY,这意味着附加段是只读的。
shmat成功返回被附加了段的地址,失败返回-1,并设置errno。

2、将附在共享内存上的进程分离:int shmdt(const void *shmaddr);

参数必须是挂在函数返回的指针。这个地址必须是shmat返回的。

图解说明:

程序:

实现一个进程修改共享内存中的数据,另一个进程读取共享内存中的数据。

步骤:

1、创建并编写makefile文件:

.SUFFIXES:.c .oCC=gccSRCS1=main1.cOBJS1=$(SRCS1:.c=.o)EXEC1=main1SRCS2=main2.cOBJS2=$(SRCS2:.c=.o)EXEC2=main2start: $(OBJS1) $(OBJS2)$(CC) -o $(EXEC1) $(OBJS1)$(CC) -o $(EXEC2) $(OBJS2)@echo "--------------------------OK------------------------".c.o:$(CC) -Wall -o $@ -c $<clean:rm -rf $(OBJS1) $(EXEC1)rm -rf $(OBJS2) $(EXEC2)
2、通过前面的一个笔记创建一块共享内存。
[negivup@negivup mycode]$ ipcs -m------ Shared Memory Segments --------key        shmid      owner      perms      bytes      nattch     status      0x00000000 229381     negivup    666        1024       0         

3、创建并编写源文件main1.c:

#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/shm.h>int main(int argc, char *args[]){// 将进程依附到共享内存上// 第一个参数是共享内存的shmid,第二个参数和第三个参数都是0// 函数的返回值是一个指向共享内存的地址,指针类型是void*void *p_temp = shmat(229381, 0, 0);// 转换指针的类型根据要写入共享内存的数据类型而定char *p = (char*)p_temp;// 将字符串拷贝至共享区strcpy(p, "hello\n");// 将进程从共享内存上剥离,传递的参数是shmat返回的地址shmdt(p);return 0;}
4、创建并编写源文件main2.c:

#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/shm.h>int main(int argc, char *args[]){// 将进程依附到共享内存上// 第一个参数是共享内存的shmid,第二个参数和第三个参数都是0// 函数的返回值是一个指向共享内存的地址,指针类型是void*void *p_temp = shmat(229381, 0, 0);// 转换指针的类型根据要读取的共享内存的数据类型而定char *p = (char*)p_temp;// 将读取的内容显示到屏幕printf("%s", p);// 将进程从共享内存上剥离,传递的参数是shmat返回的地址shmdt(p);return 0;}

5、编译并执行程序:

[negivup@negivup mycode]$ makegcc -Wall -o main1.o -c main1.cgcc -Wall -o main2.o -c main2.cgcc -o main1 main1.ogcc -o main2 main2.o--------------------------OK------------------------[negivup@negivup mycode]$ main1                        main1是向共享内存中写入数据[negivup@negivup mycode]$ main2                        main2是从共享内存中读取数据hello


PS:根据传智播客视频学习整理得出。

0 0
原创粉丝点击