IPC 共享内存
共享内存解释:
linux中进程对任何非进程地址空间的访问都是违法的,所以进程1和进程2是不能直接访问共享内存区域的,共享内存在进程1和进程2的地址空间中都会映射一段同样大小的内存区域,所有挂载在该共享内存上的进程都会开辟同样大小的内存,所有对进程内存的操作都会被同步到共享内存,以此实现进程间的通信。
创建共享内存的方法:
#include<stdio.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#define BUF_SIZE 1024
int main()
{
int id = shmget(IPC_PRIVATE,BUF_SIZE,0666);
if(id==-1)
{
perror("create shared memory fail");
}
system("ipcs -m");
return 0;
}
新创建的共享内存上的挂载进程数为0。
在某个共享内存上挂载进程:
#include<stdio.h>
#include<sys/types.h>
#include<sys/shm.h>
#include<stdlib.h>
int main(int args,char* argc[])
{
if(args<2)
{
puts("input the shmid!");
exit(-1);
}
int shmid = atoi(argc[1]);
char* addr = shmat(shmid,0,0);
if(addr!=(void*)-1)
{
perror("shmat error");
}
system("ipcs");
while(1);
return 0;
}
shmat的第一个参数是共享内存的id,第二个参数为0表示进程导入点的内存地址由系统决定,也可以指定导入点,不过不建议这样做,第三个参数为0表示这段内存地址可以读写,返回值为进程共享内存导入点的地址,如果失败,返回(void*)-1
开启三个终端,运行:
发现nattch变为3,表示目前共有3个进程共享这片内存区域。
从某共享内存上卸载进程:
参数为shmat的返回值。
使用共享内存进行进城之间的通信:
#include<stdio.h>
#include<sys/types.h>
#include<sys/shm.h>
#include<stdlib.h>
int main(int args,char* argc[])
{
if(args<3)
{
puts("error!");
exit(-1);
}
int shmid = atoi(argc[1]);
int oper = atoi(argc[2]);
char* addr = shmat(shmid,0,0);
if(addr==(void*)-1)
{
perror("shmat error");
exit(-1);
}
if(oper==1) // write shared memory
{
scanf("%s",addr);
}
else if(oper==2) // read shared memory
{
printf("%s\n",addr);
}
return 0;
}