目录
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);
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |