Linux内存共享

SystemV内存共享

创建共享内存

/**

输入:

             key_t key      标识符的规则
             size_t size    共享内存大小
             int shmflg     读写权限

输出: 成功返回共享内存标识符Id

             失败  -1

说明:

             IPC_CREAT        若共享内存不存在,则创建;若存在,则打开
             IPC_CREAT | IPC_EXCL    若共享内存不存在,则创建,若存在,则报错
             个别Linux系统(Ubuntu)需要加上0666参数进行校验,才能获取共享内存空间中的值
              #define PERM  S_IRUSR | S_IWUSR | IPC_CREAT

*/

int shmget(key_t key, size_t size, int shmflg);

连接共享内存
/**

输入:

           int shmid  共享存储id
           voidr* addr   一般为0
           int flag     一般为0

输出: 成功 – 共享存储段地址

           失败 -- -1

说明:

*/

void shmat(int shmid, voidr addr, int flag);

删除共享存储段地址

int shmdt(void* addr);

控制共享内存

/**

输入:

           int shmid  共享存储id
           int cmd      控制命令
           struct shmid_ds *buf

输出:

说明:

            控制命令:IPC_RMID
                             IPC_STAT
                             SHM_LOCK
                             SHM_UNLOCK

*/
int shmctl(int shmid, int cmd,struct shmid_ds *buf);

注意:

创建或打开共享内存错误原因,errno储存错误原因。
EINVAL 参数size小于SHMMIN或大于SHMMAX。
EEXIST 预建立key所致的共享内存,但已经存在。
EIDRM 参数key所致的共享内存已经删除。
ENOSPC 超过了系统允许建立的共享内存的最大值(SHMALL )。
ENOENT 参数key所指的共享内存不存在,参数shmflg也未设IPC_CREAT位。
EACCES 没有权限。
ENOMEM 核心内存不足。

#include <semaphore.h>
#inlcude <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <ipc.h>
#include <sys/shm.h>
#include <fcntl.h>
sem_t *semid;
int main(int argc, char** argv)
{
     const char* semName = "sem_name_run";
     semid = sem_open(semName,O_CREAT,0644,0);
     if(semid == SEM_FAILED)
     {
            perror("unable to create semaphore");
            unlink(semName);
            exit(-1);
     }
     if(fork() == 0)
     {
            int shmid = shmget(0x123,1024,IPC_CREAT|0666);
            char* data;
            if(shmid <0)
           {
                    perror("shmget failed");
                    exit(-1);
           }
           data = (char*)shmat(shmid,0,0);
           sprintf(data,"%s","xxx");
            sem_post(semid);
     }
     sem_wait(semid);
     int shmid;
     shmid = shmget(0x123,1024,IPC_CREAT|0666);
     char* data;
     data = shmat(0x123,0,0);
     printf("data: %s",data);
     sem_close(semid);
     sem_unlink(semName);
     return 0;
}

你可能感兴趣的:(Linux内存共享)