#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <string.h>
typedef struct
{
key_t key;
int shmid;
int shmSize;
}SHM_INFO_S;
int shm_create(SHM_INFO_S *shm)
{
shm->shmid = shmget((key_t)shm->key, shm->shmSize, 0777 | IPC_CREAT);
if (shm->shmid < 0)
{
printf("shmget failed\n");
return -1;
}
return 0;
}
int shm_read(SHM_INFO_S *shm, void *data, int dataLen, int offset)
{
if (dataLen > shm->shmSize)
{
printf("dataLen > shmSize\n");
return -1;
}
char *pshm = shmat(shm->shmid, NULL, 0);
if (NULL == pshm)
{
return -1;
}
memcpy(data, pshm + offset, dataLen);
shmdt(pshm);
return 0;
}
int shm_write(SHM_INFO_S *shm, void *data, int dataLen, int offset)
{
if (dataLen > shm->shmSize)
{
printf("dataLen > shmSize\n");
return -1;
}
char *pshm = shmat(shm->shmid, NULL, 0);
if (NULL == pshm)
{
return -1;
}
//memset(pshm, 0x0, shm->shmSize);
memcpy(pshm + offset, data, dataLen);
shmdt(pshm);
return 0;
}
void shm_memset(SHM_INFO_S *shm)
{
char *pshm = shmat(shm->shmid, NULL, 0);
if (NULL == pshm)
{
return -1;
}
memset(pshm, 0x0, shm->shmSize);
}
int shm_del(SHM_INFO_S *shm)
{
return shmctl(shm->shmid, IPC_RMID, NULL);
}
Linux共享内存通用接口(进程通信)
最新推荐文章于 2024-03-29 17:30:27 发布
本文档介绍了如何使用C/C++进行共享内存的创建、读写、清零和删除,包括`shmget`、`shmat`、`shmdt`和`shmctl`关键函数,适合理解进程间通信的初学者。
2229

被折叠的 条评论
为什么被折叠?



