tenvf,马关人伤不起,云南省人民政府
函数名 | 功能描述 |
---|---|
shmget | 创建共享内存,返回pic key |
shmat | 第一次创建完共享内存时,它还不能被任何进程访问,shmat()函数的作用就是用来启动对该共享内存的访问,并把共享内存连接到当前进程的地址空间 |
shmdt | 该函数用于将共享内存从当前进程中分离。注意,将共享内存分离并不是删除它,只是使该共享内存对当前进程不再可用。 |
int shmget(key_t key, size_t size, int shmflg);
第一个参数,与信号量的semget函数一样,程序需要提供一个参数key(非0整数),它有效地为共享内存段命名,shmget()函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1.
不相关的进程可以通过该函数的返回值访问同一共享内存,它代表程序可能要使用的某个资源,程序对所有共享内存的访问都是间接的,程序先通过调用shmget()函数并提供一个键,再由系统生成一个相应的共享内存标识符(shmget()函数的返回值),只有shmget()函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。
第二个参数,size以字节为单位指定需要共享的内存容量
第三个参数,shmflg是权限标志,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与ipc_creat做或操作。共享内存的权限标志与文件的读写权限一样,举例来说,0644,它表示允许一个进程创建的共享内存被内存创建者所拥有的进程向共享内存读取和写入数据,同时其他用户创建的进程只能读取共享内存。
void *shmat(int shm_id, const void *shm_addr, int shmflg);
调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1.
int shmctl(int shm_id, int command, struct shmid_ds *buf);
#include <stdio.h> #include <string.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdlib.h> int main(){ int shm; char* ptr; shm = shmget(ipc_private, 129, ipc_creat | 0600); if(shm < 0){ perror("shmget"); return 1; } ptr = (char*)shmat(shm, null , 0); if(atoi(ptr) == -1){ perror("shmat"); return -1; } strcpy(ptr, "hello"); shmdt(ptr); return 0; }
用下面的命令,能够查看到上面的程序创建的共享内存。
ipcs -m
#include <stdio.h> #include <string.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdlib.h> int main(int argc, char* argv[]){ int shm; char* ptr; if(argc != 2){ return 1; } shm = atoi(argv[1]); ptr = (char*)shmat(shm, null, 0); if(atoi(ptr) == -1){ perror("shmat"); return 1; } printf("string from shared memory : %s\n", ptr); shmdt(ptr); return 0; }
./a.out 789884
#include <stdio.h> #include <string.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdlib.h> int main(int argc, char* argv[]){ int shm; shmid_ds sds; if(argc != 2){ printf("argc is wrong"); return 1; } shm = atoi(argv[1]); if(shmctl(shm, ipc_rmid, &sds) != 0){ perror("shmctl"); return 1; } return 0; }
用命令行删除共享内存:【ipcs -m】执行后,得到下面的数字。
ipcrm -m 321843
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论