进程间通信(下)

作者: iamsonormal2333 | 来源:发表于2017-03-03 00:08 被阅读9次

    消息队列

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

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

    相关文章

      网友评论

        本文标题:进程间通信(下)

        本文链接:https://www.haomeiwen.com/subject/brjkgttx.html