首页 > 其他分享 >mm-qcamera-daemon主函数分析

mm-qcamera-daemon主函数分析

时间:2024-06-09 18:04:27浏览次数:26  
标签:case info daemon mm qcamera list read fd FD

目录

main函数核心


main函数核心

    main函数的主要任务包含在一个do{ } while(1)循环中. while循环中主要是监听文件描述符,故mai函数是由文件的读写来进行驱动的。

    所有的文件描述符被封装成结构体 read_fd_info_t.其定义如下:

/** read_fd_info_t
 * @type -- either domain socket fd or mct fd
 * @session -- session index
 * @fd  --
 *    in case of domain socket fd: fd[0]
 *    in case of mct pipe fd: fd[0] - server read fd
 *                                        fd[1] - mct write fd
 **/
typedef struct _read_fd_info {
    read_fd_type type;
    typedef enum _read_fd_type {
        RD_FD_HAL, // 内核节点 /dev/video0
        RD_DS_FD_HAL, // socket通信
        RD_PIPE_FD_MCT, // 管道通信
        RD_FD_NONE
    } read_fd_type;
    unsigned int session;

    int fd[2];
} read_fd_info_t;

​各种类型的文件描述符,将做为结构体mct_list_t中的data域,最后以链表的形式保存下来,最后形成的链表如下:

    main函数的主要任务包含在一个do{ } while(1)循环中. while循环中主要是监听文件描述符,故mai函数是由文件的读写来进行驱动的。

    所有的文件描述符被封装成结构体 read_fd_info_t.其定义如下:

/** read_fd_info_t

 * @type -- either domain socket fd or mct fd

 * @session -- session index

 * @fd  --

 *    in case of domain socket fd: fd[0]

 *    in case of mct pipe fd: fd[0] - server read fd

 *                                        fd[1] - mct write fd

 **/

typedef struct _read_fd_info {

    read_fd_type type;

typedef enum _read_fd_type {

RD_FD_HAL, // 内核节点 /dev/video0

RD_DS_FD_HAL, // socket通信

RD_PIPE_FD_MCT, // 管道通信

RD_FD_NONE

} read_fd_type;

    unsigned int session;

    int fd[2];

} read_fd_info_t;

​各种类型的文件描述符,将做为结构体mct_list_t中的data域,最后以链表的形式保存下来,最后形成的链表如下:

主程序通过如下循环去检测这些文件描述符:

do {

    FD_ZERO(&(select_fds.fds));

    mct_list_traverse(listen_fd_list, server_reset_select_fd, &select_fds);



    // no timeout

    ret = select(select_fds.select_fd + 1, &(select_fds.fds), NULL, NULL, NULL);



    if (ret > 0) {

        mct_list_t  *find_list;

        read_fd_info_t *fd_info;



        find_list = mct_list_find_custom(listen_fd_list, &(select_fds.fds), server_check_listen_fd);

        if (!find_list)

            continue;

  

        fd_info = (read_fd_info_t *)find_list->data;



        switch (fd_info->type) {

            case RD_FD_HAL:

                    ......

            case RD_DS_FD_HAL:

                    ......

            case RD_PIPE_FD_MCT:

                    ......

            default:

              continue;

        }



        switch (proc_ret.result) {

            case RESULT_NEW_SESSION:

                    ......

            case RESULT_DEL_SESSION:

                    ......

            case RESULT_FAILURE:

                    ......

            case RESULT_SUCCESS:

                    ......

            default:

               break;

        }

    }

} while(1);

主程序通过如下循环去检测这些文件描述符:

do {
    FD_ZERO(&(select_fds.fds));
    mct_list_traverse(listen_fd_list, server_reset_select_fd, &select_fds);
    // no timeout
    ret = select(select_fds.select_fd + 1, &(select_fds.fds), NULL, NULL, NULL);
    if (ret > 0) {
        mct_list_t  *find_list;
        read_fd_info_t *fd_info;
        find_list = mct_list_find_custom(listen_fd_list, &(select_fds.fds), server_check_listen_fd);
        if (!find_list)
            continue;
  
        fd_info = (read_fd_info_t *)find_list->data;
        switch (fd_info->type) {
            case RD_FD_HAL:
                    ......
            case RD_DS_FD_HAL:
                    ......
            case RD_PIPE_FD_MCT:
                    ......
            default:
              continue;
        }
        switch (proc_ret.result) {
            case RESULT_NEW_SESSION:
                    ......
            case RESULT_DEL_SESSION:
                    ......
            case RESULT_FAILURE:
                    ......
            case RESULT_SUCCESS:
                    ......
            default:
               break;
        }
    }
} while(1);

标签:case,info,daemon,mm,qcamera,list,read,fd,FD
From: https://blog.csdn.net/weixin_39732855/article/details/139477876

相关文章

  • Mac 安装 Node Error: Could not symlink include/node/common.gypi
    根据提示,赋权限,删除文件等jimmy@MacBook-Pro~%brewlinknodeLinking/usr/local/Cellar/node/20.0.0...Error:Couldnotsymlinkinclude/node/common.gypiTarget/usr/local/include/node/common.gypialreadyexists.Youmaywanttoremove......
  • SuntoryProgrammingContest2024(AtCoder Beginner Contest 357)
    A-SanitizeHands题意:给定一个序列和m,问m按顺序减去这个序列,m>=0情况下最多能减多少个数思路:前缀和+prev(upper_bound())总结:disinfectan(消毒ji),disinfect(消毒,杀毒),aliens(外星人),voidsolve(){ intn,m; cin>>n>>m; vector<int>a(n); for(inti=......
  • GLaMM : Pixel Grounding Large Multimodal Model
    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract大型多模态模型(LMM)将大语言模型扩展到视觉领域。最初的LMM使用整体图像和文本提示词来生成无定位的文本响应。最近,区域级LMM已被用于生成视觉定位响应。然而,它们仅限于一次仅引用单个目标类别,要求用户指定......
  • 图文详解Windows系统下搭建mysql开发环境——mysql Community 8 和 navicat Premium 1
    在正式开始学习使用MySQL之前,我们有必要先搭建一个良好的开发环境,让我们的学习和工作效率事半功倍。本文涉及到的软件百度云盘:链接:https://pan.baidu.com/s/1jj_YajEv8adeEjMrXLhOTQ?pwd=1023提取码:1023目录客户机—服务器软件MySQL版本MySQL的下载和安装MySQL服务的......
  • 【跌倒检测】HMM+SVM形状特征跌倒检测 (含准确率)【含Matlab源码 4624期】
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信。......
  • 设计模式:命令模式(Command Pattern)及实例
     好家伙, 0.什么是命令模式在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象......
  • summer-data介绍
    官网地址:https://www.summer-data.com代码库地址:https://gitee.com/hahan2020/summer-datasummer-data是什么?summer-data设计用于替代mybatis和hibernate。从个人角度挑一些它们和springjdbc-template的缺点,这些缺点是我创作summer-data的原因。mybatis需......
  • PHP Standards Recommendations(PSR)
    以下是PHPStandardsRecommendations(PSR)的全部内容:PSR-1:基础编码标准:规定了PHP代码的基本格式和要求,包括文件的编码、标签的使用、代码的组织等。PSR-2:编码风格指南:是对PSR-1的扩展,详细规定了PHP代码的排版、缩进、命名规范等,以提高代码的可读性。PSR-3:日志接口:定义......
  • Linux开发:多进程通过shm_open/mmap共享内存
    Linux编程:多进程间通过shmget共享内存_检测共享内存中是否有数据-CSDN博客介绍了通过SYSV的方式进行多进程间共享内存,这种方式属于比较久远的方式。POSIX也提供了共享内存的方法,使用起来要更容易些式其原理是利用Linux的tmpfs(Linux开发:tmpfs文件系统-CSDN博客)$df......
  • 前端工程化工具系列(八)——Commitizen(v4.3.0):Git提交规范化工具
    在前端工程化工具系列(四)——Commitlint(v19.3.0):规范化Git提交中曾介绍过commitlint,它主要负责检查提交信息的规范性。而本文中的commitizen,则是提供给了一个交互式的命令行界面,引导开发者按照预定义的格式填写提交信息。它俩的目的都是规范git提交。按照使用习惯......