shm共享内存使用示例
来源:互联网 发布:数据统计分析的目的 编辑:程序博客网 时间:2024/06/09 16:40
#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);}