首页 > 代码库 > 进程间通信IPC-内存共享
进程间通信IPC-内存共享
函数:
(1)int shmget(key_t key, int size, int shmflg),开辟或使用一块共享内存。
(2)void *shmat(int shmid, const void *shmaddr, int shmflg), 将参数shmid所指向的共享内存与当前进程连接。当使用某共享内存时,需要先使用shmat,达成连接。
(3)int shmdt(const void *shmaddr),将先前用shmat连接的共享内存与当前进程解除连接。参数shmaddr为shmat返回的共享内存的地址。在完成对共享内存的使用后,需要使用shmdt解除连接。
(4)int shmctl(int shmid, int cmd, struct shmid_ds *buf),控制内存的操作。当cmd为IPC_RMID时,删除shmid所指的共享内存。
实例:
file: shmshare.c #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<sys/ipc.h> #include<sys/shm.h> int main(int argc, char* argv[]) { int shmid = shmget(IPC_PRIVATE, 1024, IPC_CREAT | 0666); if (shmid < 0) { perror("shmget"); exit(EXIT_FAILURE); } printf("create shared memory OK, size = 1024, shmid = %d\n", shmid); char* buff = (char*)shmat(shmid, NULL, 0); if ((int)buff == -1) { perror("shmat"); exit(EXIT_FAILURE); } memset(buff, 0, 1024); char temp[1024] = ""; scanf("%s", temp); strncpy(buff, temp, 1024); shmctl(shmid, IPC_RMID, NULL); return 0; }
file: shmshare2.c #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<sys/ipc.h> #include<sys/shm.h> #include<assert.h> int main(int argc, char* argv[]) { assert(argc == 2); int shmid = atoi(argv[1]); char* buff = (char*)shmat(shmid, NULL, 0); if ((int)buff == -1) { perror("shmat"); exit(EXIT_FAILURE); } while(1) { if (buff[0]) { printf("buff:%s\n", buff); break; } } shmdt(buff); return 0; }
$gcc -Wall -o shmshare shmshare.c $./shmshare create shared memory OK, size = 1024, shmid = 229377 <wait for input>
$gcc -Wall -o shmshare2 shmshare2.c $./shmshare2 229377 print <wait for input>
总结:共享内存是各种通信方式中效率最高的,但是也有一些问题,如多进程,多线程访问共享内存时同步问题。各种通信方式大同小易,原理都差不多,都是由系统提供支持的通信方式。从消息队列,信号量可以看出,这系列POSIX IPC的方式是类似,查看man手册可以了解到更多的用法。
进程间通信IPC-内存共享
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。