• linux内核进程间通信IPC----消息队列


    消息队列:提供一种从一个进程向另一个进程发送一个数据块的方法。与FIFO相比,消息队列的优势在于,它独立于发送和接收进程而存在。

      1.链表式结构组织,存放于内核。

      2.通过队列标识来引用。

      3.通过一个数据类型来索引指定的数据。

    Linux内核的等待队列(Wait Queue是重要的数据结构,与进程调度机制紧密相关联,可以用来同步对系统资源的访问异步事件通知跨进程通信(IPC等。

    在Linux驱动程序中,可以使用等待队列(Wait Queue)来实现阻塞进程的唤醒。

    1.定义“等待队列头部”

    wait_queue_head_t my_queue;

    2.初始化“等待队列头部”

    init_waitqueue_head(&my_queue);

      而下面的DECLARE_WAIT_QUEUE_HEAD()宏可以作为定义并初始化等待队列头部的“快捷方式”。

    DECLARE_WAIT_QUEUE_HEAD (name)

    3.定义等待队列元素

    DECLARE_WAITQUEUE(name, tsk)

      该宏用于定义并初始化一个名为name的等待队列元素。

    4.添加/移除等待队列

    void add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);

    void remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait); 

    add_wait_queue()用于将等待队列元素wait添加到等待队列头部q指向的双向链表中,而

    remove_wait_queue()用于将等待队列元素wait从由q头部指向的链表中移除。

    5.等待事件

    wait_event(queue, condition)

    wait_event_interruptible(queue, condition)

    wait_event_timeout(queue, condition, timeout)

    wait_event_interruptible_timeout(queue, condition, timeout)  

    等待第1个参数queue作为等待队列头部的队列被唤醒,而且第2个参数condition必须满足,否则继续阻塞。wait_event()和wait_event_interruptible()的区别在于后者可以被信号打断,而前者不能。加上_timeout后的宏意味着阻塞等待的超时时间,以jiffy为单位,在第3个参数的timeout到达时,不论condition是否满足,均返回。

    函数原型:

    #define wait_event_interruptible(wq, condition)

    ({

    int __ret = 0;

    if (!(condition))

    __wait_event_interruptible(wq, condition, __ret);

    __ret;

    })

    @wq:等待队列,创建等待队列查看

    @condition:当是0时候进程进入休眠,是1的时候继续往下运行

    6.唤醒队列

    void wake_up(wait_queue_head_t *queue);

    void wake_up_interruptible(wait_queue_head_t *queue);  

    wake_up()应该与wait_event()或wait_event_timeout()成对使用,而wake_up_interruptible()则应与wait_event_interruptible()或wait_event_interruptible_timeout()成对使用。wake_up()可唤醒处于TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE的进程,而wake_up_interruptible()只能唤醒处于TASK_INTERRUPTIBLE的进程。

  • 相关阅读:
    浅谈估值模型:估值幻觉
    Java -- (part16)
    Spring解决循环依赖
    java spring MVC环境中实现WebSocket
    【深度学习】DDoS-Detection-Challenge aitrans2024 入侵检测,基于机器学习(深度学习)判断网络入侵
    Mathematica求解方程——Solve、Reduce、NSolve等函数
    [附源码]计算机毕业设计基于springboot框架的资产管理系统设计与实现
    物联网市场规模迅速增加,在交通、医疗、农业等方面发展势头迅猛
    【Linux】:使用git命令行 || 在github创建项目 || Linux第一个小程序——进度条(进阶版本)
    Oracle 踩坑记录
  • 原文地址:https://blog.csdn.net/FPGASOPC/article/details/132907536