1.共享内存读写操作
实例:
创建两个进程,在 A 进程中创建一个共享内存,并向其写入数据,通过 B 进程从共享内存中读取数据。
writer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define BUFF_SIZE 1024
int main(int argc, char *argv[])
{
int shmid;
int ret;
key_t key;
char *shmadd;
//创建key值
key = ftok("./", 2021);
if(key == -1)
{
perror("error to ftok:");
exit(-1);
}
//创建共享内存
shmid = shmget(key, BUFF_SIZE, IPC_CREAT|0666);
if(shmid < 0)
{
perror("error to shmget:");
exit(-1);
}
//映射
shmadd = shmat(shmid, NULL, 0);
if(shmadd < 0)
{
perror("error to shmat:");
exit(-1);
}
//拷贝数据至共享内存区
printf("shmid=%d\n",shmid);
printf("copy data to shared-memory\n");
bzero(shmadd, BUFF_SIZE); // 共享内存清空
strcpy(shmadd, "how are you, welcome to linux world!\n");
return 0;
}
reader.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define BUFF_SIZE 1024
int main(int argc, char *argv[])
{
int shmid;
int ret;
key_t key;
char *shmadd;
//创建key值
key = ftok("./", 2021);
if(key == -1)
{
perror("error to ftok:");
exit(-1);
}
system("ipcs -m"); //查看共享内存
//打开共享内存
shmid = shmget(key, BUFF_SIZE, IPC_CREAT|0666);
if(shmid < 0)
{
perror("error to shmget:");
exit(-1);
}
//映射
shmadd = shmat(shmid, NULL, 0);
if(shmadd < 0)
{
perror("error to shmat:");
exit(-1);
}
//读共享内存区数据
printf("data =%s\n", shmadd);
//分离共享内存和当前进程
ret = shmdt(shmadd);
if(ret < 0)
{
perror("error to shmdt:");
exit(1);
}
else
{
printf("deleted shared-memory\n");
}
//删除共享内存
shmctl(shmid, IPC_RMID, NULL);
system("ipcs -m"); //查看共享内存
return 0;
}
运行结果:
[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./writer
shmid=32769
copy data to shared-memory
[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./reader
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000072 0 root 444 1 5
0xe5010131 32769 root 666 1024 0
data =how are you, welcome to linux world!
deleted shared-memory
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000072 0 root 444 1 5