进程间通信(下)

消息队列

在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);

前两个函数等待信号量,第三个函数挂出信号量,第四个函数则是得到信号量的值。

你可能感兴趣的:(进程间通信(下))