Linux进程间通信学习记录(IPC 机制、共享内存以及信号灯集)

0.System V IPC机制:

        ①.IPC对象包含:共享内存、消息队列和信号灯集。

        ②.每个IPC对象有唯一的ID。

        ③.IPC对象创建后一直存在,直到被显示地删除。

        ④.每一个IPC对象有一个关联的KEY。(其他进程通过KEY访问对应的IPC对象)

        ⑤.ipcs(显示系统所有的IPC对象)、ipcrm

一. 生成KEY值 - ftok

功能

        成功时返回(合法的key值),失败时返回(EOF)。

        若传入的参数一样,那么得到的key值也一样

参数

        path:存在且可访问的文件的路径

        proj_id:用于生成key的数字,不能为0,一般为字符常量

int key_t ftok(const char *path,int proj_id);
int main(int argc,char *argv[])
{
    key_t key;

    key = ftok(".",'a');
    if(-1 == key)
    {
        perror("key error");
        exit(-1);
    }
}

二.共享内存

0.特点

        ①.共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。

        ②.共享内存在内核空间创建,可被进程映射到用户空间访问,使其灵活。

        ③.由于多个进程可同时访问共享内存,因此需要同步和互斥机制配合使用

        ④.共享内存的大小有限制

1.创建/打开共享内存 - shmget()

功能

        创建/打开共享内存对象

        成功时返回(共享内存的id),失败时(EOF)

参数

        key:和共享内存关联的key,IPC_PRIVATE或由ftok生成。

        size:共享内存的大小,单位为字节。

        shmflg:共享内存标志位 IPC_CREATE | 0666(不存在就创建,存在了就打开)。

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

示例1:创建一个私有的共享内存,大小为512字节,权限为0666

int shmid;

shmid = shmget(IPC_PRIVATE,512,0666);
if(0 > shmid)
{
    perror("shmget error");
    exit(-1);
}

示例2:创建/打开一个和key关联的共享内存,大小为1024字节,权限为0666

key_t key;
int shmid;

/* 1.先生成key(相关的进程调用ftok时,传入相同的参数才能得到相同的key) */
key = ftok(".",'m');
if(-1 == key)
{
    perror("ftok");
    exit(-1);
}

/* 2.获取共享内存 */
shmid = shmget(key,1024,IPC_CREATE | 0666);
if(0 > shmid)
{
    perror("shmget");
    exit(-1);
}

2.映射共享内存 - shmat

功能

        映射共享内存;

        成功时返回(映射后的地址),失败时返回((void *)-1),通过指针访问共享内存,指针类型取决于共享内存中存放的数据的类型;

参数

        shmid:要映射的共享内存的id。

        shmaddr:指定映射后的地址(通常传入NULL&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值