您的位置:首页 > 其它

shm共享内存使用示例

2013-04-02 11:14 417 查看
#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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: