消息队列
在UNP第二卷中详细介绍了两种消息队列:Posix消息队列和System V消息队列。这两种消息队列很相似,主要差别是:
1.Posix消息队列只能返回最高优先级的消息,System V可返回任意指定优先级的消息;
2.往一个空队列放消息时,Posix队列允许产生一个信号或启动一个线程,System V队列不提供这种机制;
这里我们以Posix消息队列为例。首先给出创建和关闭队列的函数
mqd_t mq_open(const char *name,int flag
/*, mode_t mode, struct mq_attr *attr*/);
int mq_close(mad_t mqdes);
name是路径名,oflag参数是O_RDONLY、O_WRONLY或O_RDWR之一,当创建队列时,后两个参数是需要的。函数的返回值是消息队列描述符。
对于消息队列中的每个消息都有一个优先级,用一个小于MQ_PRIO_MAX的无符号整数表示。消息队列中消息的发送和接收函数如下
int mq_send(mad_t modes, const char *ptr, size_t len,
unsigned int prio);
ssize_t mq_receive(mqd_t modes, char *ptr, size_t len,
unsigned int prio);
这里需要注意的是len参数的值不能小于能加到所制定的队列中消息的最大大小。
信号量
在UNP第二卷中主要提到了三种信号量:Posix有名信号量、Posix基于内存的信号量和System V信号量。
对于一个信号量,我们可以在某一个进程上执行三种操作:
1.创建一个信号量,并且要求创建者指定初值。
2.等待一个信号量。当信号量值小于1,进程便会阻塞直到其值变为大于等于1的数。
3.挂出一个信号量,即将信号量值加一。
信号量与线程同步中的互斥锁十分相似。事实上,信号量也可以用在线程同步中。
信号量的基本函数如下
sem_t *sem_open(const char *name, int oflag
/*, mode_t mode, unsigned int value */);
int sem_close(sem_t *sem);
这两个函数的用法基本和消息队列中的用法相同。
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_post(sem_t *sem);
int sem_getvalue(sem_t *sem);
前两个函数等待信号量,第三个函数挂出信号量,第四个函数则是得到信号量的值。