#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include <unistd.h>
typedef struct
{
int nId;
char sValue[1024];
}MemTest;
MemTest *ptTest = NULL;
int InitMem()
{
int SYS_MPU_SHM_KEY = 12345;
// int shmHandle = shmget(SYS_MPU_SHM_KEY, sizeof(MemTest), SHM_R | SHM_W | IPC_CREAT | IPC_EXCL);
int shmHandle = shmget(SYS_MPU_SHM_KEY, sizeof(MemTest), SHM_R | SHM_W | IPC_CREAT);
if (shmHandle == -1)
{
printf("shmget error: %s\r\n", strerror(errno));
return -1;
}
ptTest = (MemTest *)shmat(shmHandle, NULL, 0);
if(ptTest == (MemTest *)-1)
{
printf("shmat error: %s\r\n", strerror(errno));
return -1;
}
memset(ptTest, 0, sizeof(MemTest));
printf("shm initialized ok : %d\r\n", shmHandle);
return 0;
}
int main(void)
{
if(0 != InitMem())
exit(-1);
pid_t pid = fork();
if(pid < 0)
{
printf("fork fail\r\n");
exit(-1);
}
if(pid > 0)
{
//parent process
ptTest->nId = 123;
sprintf(ptTest->sValue, "%s", "test");
printf("parent:%d,%s\r\n", ptTest->nId, ptTest->sValue);
sleep(20);
printf("parent:%d,%s\r\n", ptTest->nId, ptTest->sValue);
}
else
{
//child process
sleep(5);
printf("child:%d,%s\r\n", ptTest->nId, ptTest->sValue);
sleep(10);
ptTest->nId = 456;
sprintf(ptTest->sValue, "%s", "TEST");
sleep(10);
}
return 0;
}
void ShmTakeowner(int shmid, uid_t uid, gid_t gid)
{
struct shmid_ds shmds;
memset(&shmds, 0x0, sizeof(struct shmid_ds));
shmds.shm_perm.uid = uid;
shmds.shm_perm.cuid = uid;
shmds.shm_perm.gid = gid;
shmds.shm_perm.cgid = gid;
shmds.shm_perm.mode = 0777;
shmctl(shmid, IPC_SET, &shmds);
}
shm共享内存使用示例
最新推荐文章于 2024-02-22 20:17:47 发布