Linux信号量 共享内存和消息队列

本文详细介绍了Linux环境下进程间通信的三种核心机制:信号量、共享内存和消息队列。信号量用于进程间的同步,通过semget等函数实现。共享内存允许不同进程共享同一段内存区域,借助shmget等功能实现。消息队列则简化了进程间的消息传递过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux信号量 共享内存和消息队列

1. 信号量

使用信号量可以实现进程间同步。主要函数定义:

#include <sys/sem.h>

int semctl(int sem_id, int sem_num, int command, …);

int semget(key_t key, int num_sems, int sem_flags);

int semop(int sem_id, struct sembuf *sem_ops, size_t num_sem_ops);

 

semget函数根据提供的key生成信号量标识符;

semctl函数初始化或者删除信号量标识符;

semop函数改变信号量大小

 

2. 共享内存

共享内存机制使得两个不相关进程可以读取和修改同一段内存从而实现数据共享。主要函数定义:

#include <sys/shm.h>

void *shmat(int shm_id, const void *shm_addr, int shmflg);

int shmctl(int shm_id, int cmd, struct shmid_ds *buf);

int shmdt(const void *shm_addr);

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

 

shmget函数根据key生成有效的共享内存段名,根据参数size产生共享的内存容量。

shmat函数将创建的共享内存段连接到一个进程的内存空间中,这样才可以使用该段内存。

shmdt函数将共享内存从当前内存中分离。

shmctl函数可以删除共享内存段。

 

3. 消息队列

消息队列和命名管道非常类似,但少了打开和关闭管道的复杂性。主要函数如下:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/msg.h>

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

int msgget(key_t key, int msgflg);

int msgrcv(int msqid, void *msg_ptr, size_t msg_sz, long int msgtype, int msgflg);

int msgsnd(int msqid, const void *msg_ptr, size_t msg_sz, int msgflg);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值