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);}


原创粉丝点击