1)System V IPC的相关概念
- System V IPC是OS特地设计的通信方式,为了让不同的进程能够看到同一份资源;
- 消息队列、共享内存:以传送数据为目的;
- 信号量:保证进程的同步与互斥,属于通信范畴。
2)System V 共享内存的相关概念
- 共享内存区(在物理内存中)是最快的IPC形式,一旦这样的内存映射到共享它的进程的地址空间,进程之间的数据传递不再涉及到内核;
- 共享内存的生命周期随内核,必须手动删除,否则不会自动清除,除非重启;
- key值是在内核层面上,多个进程之间,区分共享内存的唯一方式;
- shmid是在进程内部,区分IPC资源;
- 查看共享内存信息:ipcs -m
- 删除某一共享内存: ipcrm rm shmid号
3)System V 共享内存的相关操作
- 生成key值(唯一标识一块共享内存)----ftok( )
- 创建共享内存----shmget( )
- 关联共享内存----shmat( )
- 取消关联共享内存----shmdt( )
- 删除共享内存块----shmdtl( )
4) 使用System V 共享内存实现Server&Client通信
- Server端读取共享内存中的数据
int main(){
key_t key = ftok(PATHNAME, PROJ_ID);
printf("key: %p\n", key);
int shmid = shmget(key, SIZE, IPC_CREAT | IPC_EXCL |0666);
if(shmid < 0){
printf("shmget error...\n");
exit(1);
}
printf("shmid: %d\n", shmid);
char* str = (char*)shmat(shmid, NULL, 0);
while(1){
sleep(1);
printf("%s\n", str);
}
shmdt(str);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
- Client端向共享内存中传送数据
int main(){
key_t key = ftok(PATHNAME, PROJ_ID);
printf("key: %p\n", key);
int shmid = shmget(key, SIZE, 0);
if(shmid < 0){
printf("shmget erroe...\n");
exit(1);
}
printf("shmid: %d\n", shmid);
char* str = (char*)shmat(shmid, NULL, 0);
char c = 'a';
for(; c<='z'; c++){
str[c-'a'] = c;
sleep(5);
}
shmdt(str);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}