目录
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/video0RD_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/video0RD_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 timeoutret = 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 timeoutret = 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);