消息队列, 信号量, 共享内存
1.消息队列的概念:
消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式及特定的优先级。对消息队列有写权限的进程可以像中按照一定的规则添加新消息,对消息队列有读权限的进程则可以从消息队列读走消息,消息队列是随内核持续的。
2.消息队列的基础理论:
struct kern_ipc_perm
{
key_t key;
uid_t uid;
gid_t gid;
uid_t cuid;
gid_t cgid;
more_t mode;
unsigned long seq;
};
3.消息队列的使用:
(1)打开或创建消息队列
(2)读写操作
struct msgbuf
{
long mtype;
char mtext[1];
}
(3)获得或设置消息队列属性
4.消息队列API
(1)ftok 函数
key = ftok(path_ptr, 'a');
ipc_id = ipc(MSGGET, (int)key, flags, 0, NULL, 0);
...
(2)msgget 函数
创建消息队列
(3)msgrcv 函数
读出消息队列
(4)msgsnd 函数
往消息队列写入数据
(5)msgctl 函数
控制消息队列
5.信号灯概念:
提供对进程间共享资源访问控制机制。相当于内存中的标志,进程可以根据它判断是否能够访问某些资源,同时进程
也可以修改该标志。除了访问控制还可以用于进程同步。
二种分类:
(1)二值信号灯
(2)计算信号灯
6.内核实现原理
struct sem
{
int semval;
int sempid;
}
7.实现信号灯
(1)打开或创建信号灯
(2)信号灯值操作
(3)获得或设置信号灯属性
8.信号灯API
(1)semget用于配置信号灯
(2)semop用于信号灯处理
(3)semctl用于控制信号灯
9.内存共享一
mmap()
fd = open(name, flag, mode);
if(fd < 0)
ptr = mmap(NULL, len, PROT_READ | PROT_WRITE | RPROT_WRITE, MAP_SHARED, fd, 0);
10.内存共享二
shmat()
struct shmid_kernel
{
struct kern_ipc_perm shm_perm;
struct file * shm_file;
int id;
unsigned long shm_nattch;
unsigned long shm_segsz;
time_t shm_atim;
time_t shm_dtim;
time_t shm_ctim;
pid_t shm_cprid;
pid_t shm_lprid;
};