这段小代码可以很好的让我理解共享内存的操作
要提醒的是指明的key文件必须是已经存在的,ftok不会自己创建, 我刚开始以为是ftok会创建key值文件的,结果程序运行报错,现在把创建文件的功能写入程序里
- // ///// tWrite.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h> //for thread
- #include <sys/shm.h> //shmat
- #include <sys/errno.h>
- /*
- 0666表示权限,跟文件的权限设置是一样的。
- 4 2 1 分别表示,读 写 执行,3种权限。
- 比如,上面的 6 = 4 + 2 ,表示 读+写。
- 如果是 7 = 4 + 2 + 1 ,表示 读+写+执行。
- 另,0666 每一位表示一种类型的权限,比如,第一个0是UID,第一个表示拥有者的权限,第二个6表示同组权限,第3个6表示他人的权限。
- */
- int main()
- {
- int liShmId; //申请的共享内存的开始地址
- key_t key; //为共享内存申请的key
- char* p_map; //把这块共享内存映射到自己的程序空间
- char lsData[1024];
- char *lpName = "/home/report/lb/shmkey";
- FILE *lpFp = fopen(lpName, "w");
- fclose(lpFp);
- key = ftok(lpName, 0);
- if(key == -1)
- {
- printf("ftok return error:%d/n", errno);
- return -1;
- }
- printf("ftok return:%0x/n", key);
- /*先用ftok 创建一个key,再调用shmget,创建一块内存区域*/
- liShmId = shmget(key, 4096, IPC_CREAT | 0666);
- if(liShmId==-1)
- {
- printf("shmget fail! Error Code:%d/n", liShmId);
- return -1;
- }
- /*将这块共享内存区附加到自己的内存块*/
- p_map = (char*)shmat(liShmId, NULL, 0);
- if(p_map==NULL)
- {
- printf("p_map:%0x/n", p_map);
- return -1;
- }
- memset(lsData, 0, sizeof(lsData));
- strcpy(lsData, "共享内存测试程序,此为测试数据");
- memcpy(p_map, lsData, strlen(lsData));
- /*写完数据,将其从自己的内存段中"删除"*/
- if(shmdt(p_map)==-1)
- {
- printf("detach share memory /n");
- return -1;
- }
- /*从系统中删除这块内存*/
if(shmctl(liShmId, IPC_RMID, 0) < 0) //如果多次使用的话,就不需要这行代码了
{
printf("shmctl Error:%d/n", errno);
return -1;
} - return 0;
- }
程序已经创建共享内存段,3099d为返回的键值
- //tRead.c
- /*读进程首先得到共享内存的开始地址,ftok根据创建时的文件名和ID创建的key*/
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h> //for thread
- #include <sys/shm.h> //shmat/
- #include <sys/errno.h>
- int main()
- {
- int liShmId; //申请的共享内存的开始地址
- key_t key; //为共享内存申请的key
- char* p_map; //把这块共享内存映射到自己的程序空间
- char lsData[1024];
- char *lpName = "/home/report/lb/shmkey";
- key = ftok(lpName, 0);
- if(key == -1)
- {
- printf("ftok return error:%0x/n", key);
- return -1;
- }
- /*先用ftok 创建一个key,再调用shmget,创建一块内存区域*/
- liShmId = shmget(key, 4096, IPC_CREAT | 0666);
- if(liShmId==-1)
- {
- printf("shmget fail! Error Code:%d/n", errno);
- return -1;
- }
- /*将这块共享内存区附加到自己的内存块*/
- p_map = (char*)shmat(liShmId, NULL, 0);
- printf("共享内存的数据:%s/n", p_map);
- /*写完数据,将其从自己的内存段中"删除"*/
- if(shmdt(p_map)==-1)
- {
- printf("detach share memory /n");
- return -1;
- }
- return 0;
- }