目录
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