Nginx源码分析 - Event事件篇 - Event模块和配置的初始化(16)

[Python]:热血传奇-Wzl,Wzx的解析 首先我们要了解,wzl与wzx的对应关系,wzx里面存的是每张二进制图片数据在wzl中的偏移量,所以取到wzx中的偏移数据就可以取到wzl每张图片数据,其实就这么简单。结构体为 [Byte][Byte][Byte][Byte][short][short][short][short][int]-读取44至48字节代表为,[wzx中偏移值总数量] [int类型] [4字节]-根据在wzx中取得的偏移值总数量,每张图片偏移值在wzl中取图片数据。2.[取wzl中图片偏据]:根据wzx中取得数据对[ 阅读详情

 

目录

一、Event模块的数据结构

1. event事件模块的配置

2. ngx_events_module 事件模块

3. ngx_event_core_module 事件核心模块

4. ngx_event_conf_t 事件conf结构

二、Event模块结构图

三、Event模块的初始化

1. ngx_event_module_init 模块初始化函数

四、Event模块配置的初始化

1. ngx_events_module 模块配置初始化

2. ngx_conf_parse 解析顶层“event”的配置

3. ngx_events_block 解析events块block中的内容

4. ngx_event_core_create_conf和ngx_event_core_init_conf

5. ngx_event_get_conf获取event配置


Event的模块和配置的初始化,必须得结合我们讲过的两篇文章:《Nginx源码分析 - 主流程篇 - 模块的初始化》     和  《Nginx源码分析 - 主流程篇 - 解析配置文件》  

前面我们讲解了模块的初始化以及核心模块的配置文件的解析。而Event的配置解析会比核心模块解析会复杂一些,但是原理是一样的。

一、Event模块的数据结构


1. event事件模块的配置


events {  
        use epoll;  
        worker_connections  1024;  
}  

event事件模块,配置分为两层:ngx_events_module 事件模块 和 ngx_event_core_module 事件核心模块。

  • ngx_events_module:模块类型NGX_CORE_MODULE,所以此模块在最外层核心模块解析“events”命令的时候会回调ngx_events_block函数。
  • ngx_event_core_module:模块类型NGX_EVENT_MODULE,所以此模块在ngx_events_block函数被回调后,才能解析配置信息

最外层的events模块,类型NGX_CORE_MODULE,属于核心模块,核心模块在最开始配置文件初始化的时候,就会调用指令的命令集。所以在核心模块启动的时候就会调用events的模块配置解析指令函数:ngx_events_block

2. ngx_events_module 事件模块


/**
 * event模块命令集
 * 回调函数:ngx_events_block
 * 用于解析 event{} 块中的配置参数
 */
static ngx_command_t ngx_events_commands[] = {

{ ngx_string("events"), NGX_MAIN_CONF | NGX_CONF_BLOCK | NGX_CONF_NOARGS,
		ngx_events_block, 0, 0, NULL },

ngx_null_command };

/**
 * event模块上下文
 */
static ngx_core_module_t ngx_events_module_ctx = { ngx_string("events"), NULL,
		ngx_event_init_conf };

/**
 * event模块
 * 模块类型:NGX_CORE_MODULE
 * 模块类型为核心模块,所以在ngx_init_cycle就会初始化conf
 */
ngx_module_t ngx_events_module = { NGX_MODULE_V1, &ngx_events_module_ctx, /* module context */
ngx_events_commands, /* module directives */
NGX_CORE_MODULE, /* module type */
NULL, /* init master */
NULL, /* init module */
NULL, /* init process */
NULL, /* init thread */
NULL, /* exit thread */
NULL, /* exit process */
NULL, /* exit master */
NGX_MODULE_V1_PADDING };

3. ngx_event_core_module 事件核心模块


/**
 * event核心模块名称
 */
static ngx_str_t event_core_name = ngx_string("event_core");

/**
 * 定义Event核心模块的命令参数
 * 主要:
 * worker_connections 工作线程最大连接数
 * use 使用什么模型,例如epoll
 * multi_accept
 * accept_mutex_delay
 * debug_connection
 */
static ngx_command_t ngx_event_core_commands[] = {

{ ngx_string("worker_connections"), NGX_EVENT_CONF | NGX_CONF_TAKE1,
		ngx_event_connections, 0, 0, NULL },

		{ ngx_string("use"), NGX_EVENT_CONF | NGX_CONF_TAKE1, ngx_event_use, 0,
				0, NULL },

		{ ngx_string("multi_accept"), NGX_EVENT_CONF | NGX_CONF_FLAG,
				ngx_conf_set_flag_slot, 0, offsetof(ngx_event_conf_t,
						multi_accept), NULL },

		{ ngx_string("accept_mutex"), NGX_EVENT_CONF | NGX_CONF_FLAG,
				ngx_conf_set_flag_slot, 0, offsetof(ngx_event_conf_t,
						accept_mutex), NULL },

		{ ngx_string("accept_mutex_delay"), NGX_EVENT_CONF | NGX_CONF_TAKE1,
				ngx_conf_set_msec_slot, 0, offsetof(ngx_event_conf_t,
						accept_mutex_delay), NULL },

		{ ngx_string("debug_connection"), NGX_EVENT_CONF | NGX_CONF_TAKE1,
				ngx_event_debug_connection, 0, 0, NULL },

		ngx_null_command };

/**
 * Event核心模块上下文
 * ngx_event_core_create_conf:创建配置文件
 * ngx_event_core_init_conf:初始化配置文件
 */
ngx_event_module_t ngx_event_core_module_ctx = { &event_core_name,
		ngx_event_core_create_conf, /* create configuration */
		ngx_event_core_init_conf, /* init configuration */

		{ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL } };

/**
 * Event核心模块
 * ngx_event_module_init:模块初始化
 * ngx_event_process_init:进程初始化
 * 类型:NGX_EVENT_MODULE
 */
ngx_module_t ngx_event_core_module = { NGX_MODULE_V1,
		&ngx_event_core_module_ctx, /* module context */
		ngx_event_core_commands, /* module directives */
		NGX_EVENT_MODULE, /* module type */
		NULL, /* init master */
		ngx_event_module_init, /* init module */
		ngx_event_process_init, /* init process */
		NULL, /* init thread */
		NULL, /* exit thread */
		NULL, /* exit process */
		NULL, /* exit master */
		NGX_MODULE_V1_PADDING };

4. ngx_event_conf_t 事件conf结构


/**
 * event事件模块配置的结构对象
 */
typedef struct {
    ngx_uint_t    connections;
    ngx_uint_t    use;

    ngx_flag_t    multi_accept;
    ngx_flag_t    accept_mutex;

    ngx_msec_t    accept_mutex_delay;

    u_char       *name;

#if (NGX_DEBUG)
    ngx_array_t   debug_connection;
#endif
} ngx_event_conf_t;

二、Event模块结构图


 

三、Event模块的初始化


1. ngx_event_module_init 模块初始化函数


ngx_event_module_init方法为事件核心模块的初始化函数。

/**
 * event事件核心模块初始化函数
 */
static ngx_int_t ngx_event_module_init(ngx_cycle_t *cycle) {
	void ***cf;
	u_char *shared;
	size_t size, cl;
	ngx_shm_t shm;
	ngx_time_t *tp;
	ngx_core_conf_t *ccf;
	ngx_event_conf_t *ecf;

	/* 获取配置信息 */
	cf = ngx_get_conf(cycle->conf_ctx, ngx_events_module);
	ecf = (*cf)[ngx_event_core_module.ctx_index];

	if (!ngx_test_config && ngx_process <= NGX_PROCESS_MASTER) {
		ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0,
				"using the \"%s\" event method", ecf->name);
	}

	ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);

	ngx_timer_resolution = ccf->timer_resolution;

#if !(NGX_WIN32)
	{
		ngx_int_t limit;
		struct rlimit rlmt;

		if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {
			ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
					"getrlimit(RLIMIT_NOFILE) failed, ignored");

		} else {
			if (ecf->connections > (ngx_uint_t) rlmt.rlim_cur
					&& (ccf->rlimit_nofile == NGX_CONF_UNSET
							|| ecf->connections
									> (ngx_uint_t) ccf->rlimit_nofile)) {
				limit = (ccf->rlimit_nofile == NGX_CONF_UNSET) ?
						(ngx_int_t) rlmt.rlim_cur : ccf->rlimit_nofile;

				ngx_log_error(NGX_LOG_WARN, cycle->log, 0,
						"%ui worker_connections exceed "
								"open file resource limit: %i",
						ecf->connections, limit);
			}
		}
	}
#endif /* !(NGX_WIN32) */

	if (ccf->master == 0) {
		return NGX_OK;
	}

	if (ngx_accept_mutex_ptr) {
		return NGX_OK;
	}

	/* cl should be equal to or greater than cache line size */

	cl = 128;

	size = cl /* ngx_accept_mutex */
	+ cl /* ngx_connection_counter */
	+ cl; /* ngx_temp_number */

#if (NGX_STAT_STUB)

	size += cl /* ngx_stat_accepted */
	+ cl /* ngx_stat_handled */
	+ cl /* ngx_stat_requests */
	+ cl /* ngx_stat_active */
	+ cl /* ngx_stat_reading */
	+ cl /* ngx_stat_writing */
	+ cl; /* ngx_stat_waiting */

#endif

	shm.size = size;
	shm.name.len = sizeof("nginx_shared_zone") - 1;
	shm.name.data = (u_char *) "nginx_shared_zone";
	shm.log = cycle->log;

	if (ngx_shm_alloc(&shm) != NGX_OK) {
		return NGX_ERROR;
	}

	shared = shm.addr;

	ngx_accept_mutex_ptr = (ngx_atomic_t *) shared;
	ngx_accept_mutex.spin = (ngx_uint_t) -1;

	if (ngx_shmtx_create(&ngx_accept_mutex, (ngx_shmtx_sh_t *) shared,
			cycle->lock_file.data) != NGX_OK) {
		return NGX_ERROR;
	}

	ngx_connection_counter = (ngx_atomic_t *) (shared + 1 * cl);

	(void) ngx_atomic_cmp_set(ngx_connection_counter, 0, 1);

	ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
			"counter: %p, %uA",
			ngx_connection_counter, *ngx_connection_counter);

	ngx_temp_number = (ngx_atomic_t *) (shared + 2 * cl);

	tp = ngx_timeofday();

	ngx_random_number = (tp->msec << 16) + ngx_pid;

#if (NGX_STAT_STUB)

	ngx_stat_accepted = (ngx_atomic_t *) (shared + 3 * cl);
	ngx_stat_handled = (ngx_atomic_t *) (shared + 4 * cl);
	ngx_stat_requests = (ngx_atomic_t *) (shared + 5 * cl);
	ngx_stat_active = (ngx_atomic_t *) (shared + 6 * cl);
	ngx_stat_reading = (ngx_atomic_t *) (shared + 7 * cl);
	ngx_stat_writing = (ngx_atomic_t *) (shared + 8 * cl);
	ngx_stat_waiting = (ngx_atomic_t *) (shared + 9 * cl);

#endif

	return NGX_OK;
}

 

四、Event模块配置的初始化


1. ngx_events_module 模块配置初始化


ngx_init_cycle方法中的模块初始化。ngx_events_module类型为NGX_CORE_MODULE,所以在ngx_init_cycle中就会进行核心模块的初始化。

但是ngx_events_module中的create_conf方法为NULL,所以不会调用创建配置的方法。

    /*
     * 核心模块的配置文件创建
     * 配置创建调用nginx.c 中的 ngx_core_module_create_conf
     * */
    for (i = 0; cycle->modules[i]; i++) {
        if (cycle->modules[i]->type != NGX_CORE_MODULE) {
            continue;
        }

        module = cycle->modules[i]->ctx;

        if (module->create_conf) {
            rv = module->create_conf(cycle); //模块回调函数,创建模块的配置信息
            if (rv == NULL) {
                ngx_destroy_pool(pool);
                return NULL;
            }
            cycle->conf_ctx[cycle->modules[i]->index] = rv; //配置文件复制
        }
    }

2. ngx_conf_parse 解析顶层“event”的配置


ngx_init_cycle方法中会调用ngx_conf_parse方法,并且解析的/usr/local/nginx/conf/nginx.conf配置文件。此次调用只解析最顶层的配置信息“events”,而不会解析{}块中的内容

    /* 解析命令行中的配置参数;例如:nginx -t -c /usr/local/nginx/conf/nginx.conf */
    if (ngx_conf_param(&conf) != NGX_CONF_OK) {
        environ = senv;
        ngx_destroy_cycle_pools(&conf);
        return NULL;
    }

    /* 解析配置文件/usr/local/nginx/conf/nginx.conf 信息 */
    if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) {
        environ = senv;
        ngx_destroy_cycle_pools(&conf);
        return NULL;
    }

3. ngx_events_block 解析events块block中的内容


ngx_events_block方法为ngx_events_commands命令集的回调函数。在最顶层解析nginx.conf文件的时候,会进行核心模块的命令集遍历。(参考: Nginx源码分析 - 主流程篇 - 解析配置文件    中的ngx_conf_handler)   会遍历模块命令集的cmd->set方法。

ngx_events_block中主要创建ngx_event_core_module事件的核心模块以及配置信息。

/**
 * 模块解析
 * 事件模块配置如下:
 * events {
    worker_connections  1024;
    }
         光使用核心配置的方式,只能解析到 events 这一层。
         如果需要继续往{}中的内容解析,就得重新调用ngx_conf_parse进行解析
 */
static char *
ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {
	char *rv;
	void ***ctx;
	ngx_uint_t i;
	ngx_conf_t pcf;
	ngx_event_module_t *m;

	if (*(void **) conf) {
		return "is duplicate";
	}

	/* count the number of the event modules and set up their indices */

	ngx_event_max_module = ngx_count_modules(cf->cycle, NGX_EVENT_MODULE);

	/* 分配内存空间 */
	ctx = ngx_pcalloc(cf->pool, sizeof(void *));
	if (ctx == NULL) {
		return NGX_CONF_ERROR ;
	}

	*ctx = ngx_pcalloc(cf->pool, ngx_event_max_module * sizeof(void *));
	if (*ctx == NULL) {
		return NGX_CONF_ERROR ;
	}

	*(void **) conf = ctx;

	/* 模块初始化,如果是NGX_EVENT_MODULE,则调用模块的create_conf方法 */
	for (i = 0; cf->cycle->modules[i]; i++) {
		if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) {
			continue;
		}

		m = cf->cycle->modules[i]->ctx;

		if (m->create_conf) {
			(*ctx)[cf->cycle->modules[i]->ctx_index] = m->create_conf(
					cf->cycle);
			if ((*ctx)[cf->cycle->modules[i]->ctx_index] == NULL) {
				return NGX_CONF_ERROR ;
			}
		}
	}

	/* event*/
	pcf = *cf;
	cf->ctx = ctx;
	cf->module_type = NGX_EVENT_MODULE;
	cf->cmd_type = NGX_EVENT_CONF;

	/* 调用配置解析,这次解析的是 块中的内容,非文件内容 */
	rv = ngx_conf_parse(cf, NULL);

	*cf = pcf;

	if (rv != NGX_CONF_OK) {
		return rv;
	}

	/* 初始化 模块的init_conf 方法*/
	for (i = 0; cf->cycle->modules[i]; i++) {
		if (cf->cycle->modules[i]->type != NGX_EVENT_MODULE) {
			continue;
		}

		m = cf->cycle->modules[i]->ctx;

		if (m->init_conf) {
			rv = m->init_conf(cf->cycle,
					(*ctx)[cf->cycle->modules[i]->ctx_index]);
			if (rv != NGX_CONF_OK) {
				return rv;
			}
		}
	}

	return NGX_CONF_OK;
}

4. ngx_event_core_create_conf和ngx_event_core_init_conf


  • ngx_event_core_create_conf:主要是创建event事件核心模块
  • ngx_event_core_init_conf:初始化event事件核心模块
/**
 * 创建Event的核心配置文件
 */
static void *
ngx_event_core_create_conf(ngx_cycle_t *cycle) {
    ngx_event_conf_t *ecf;

    /* 分配配置文件内容 */
    ecf = ngx_palloc(cycle->pool, sizeof(ngx_event_conf_t));
    if (ecf == NULL) {
        return NULL;
    }

    /* 设置默认值 */
    ecf->connections = NGX_CONF_UNSET_UINT;
    ecf->use = NGX_CONF_UNSET_UINT;
    ecf->multi_accept = NGX_CONF_UNSET;
    ecf->accept_mutex = NGX_CONF_UNSET;
    ecf->accept_mutex_delay = NGX_CONF_UNSET_MSEC;
    ecf->name = (void *) NGX_CONF_UNSET;

#if (NGX_DEBUG)

    if (ngx_array_init(&ecf->debug_connection, cycle->pool, 4,
                    sizeof(ngx_cidr_t)) == NGX_ERROR)
    {
        return NULL;
    }

#endif

    return ecf;
}

/**
 * 初始化Event的核心配置文件
 */
static char *
ngx_event_core_init_conf(ngx_cycle_t *cycle, void *conf) {
    ngx_event_conf_t *ecf = conf;

#if (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL)
    int fd;
#endif
    ngx_int_t i;
    ngx_module_t *module;
    ngx_event_module_t *event_module;

    module = NULL;

#if (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL)

    fd = epoll_create(100);

    if (fd != -1) {
        (void) close(fd);
        module = &ngx_epoll_module;

    } else if (ngx_errno != NGX_ENOSYS) {
        module = &ngx_epoll_module;
    }

#endif

#if (NGX_HAVE_DEVPOLL) && !(NGX_TEST_BUILD_DEVPOLL)

    module = &ngx_devpoll_module;

#endif

#if (NGX_HAVE_KQUEUE)

    module = &ngx_kqueue_module;

#endif

#if (NGX_HAVE_SELECT)

    if (module == NULL) {
        module = &ngx_select_module;
    }

#endif

    /**
     * 查询使用的事件模型:epoll、kqueue等
     * 因为在模块初始化的时候,epoll\kqueue等event的模型模块都会被初始化
     * 但是每个服务器只能选择一种相应的事件模型,所以选择一个适合自己的模块
     */
    if (module == NULL) {
        for (i = 0; cycle->modules[i]; i++) {

            if (cycle->modules[i]->type != NGX_EVENT_MODULE) {
                continue;
            }

            event_module = cycle->modules[i]->ctx;

            if (ngx_strcmp(event_module->name->data, event_core_name.data)
                    == 0) {
                continue;
            }

            module = cycle->modules[i];
            break;
        }
    }

    if (module == NULL) {
        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "no events module found");
        return NGX_CONF_ERROR ;
    }

    ngx_conf_init_uint_value(ecf->connections, DEFAULT_CONNECTIONS);
    cycle->connection_n = ecf->connections;

    /**
     * 存储使用的事件模型模块索引 例如:epoll、kqueue
     * nginx.conf中存储的是:use epoll;
     * 这里会找到cycle->modules的具体模块的索引值,存储最终的索引值
     */
    ngx_conf_init_uint_value(ecf->use, module->ctx_index);

    event_module = module->ctx;
    ngx_conf_init_ptr_value(ecf->name, event_module->name->data);

    ngx_conf_init_value(ecf->multi_accept, 0);
    ngx_conf_init_value(ecf->accept_mutex, 1);
    ngx_conf_init_msec_value(ecf->accept_mutex_delay, 500);

    return NGX_CONF_OK;
}

5. ngx_event_get_conf获取event配置


获取event的配置,先获取ngx_events_module配置,然后再到ngx_events_module模块上找到ngx_event_core_module 事件核心模块的配置。

#define ngx_event_get_conf(conf_ctx, module)                                  \
             (*(ngx_get_conf(conf_ctx, ngx_events_module))) [module.ctx_index];

 

 

 

 

 

 

 

 

LeRobot 入门教程(十七)NVIDIA IsaacLab Arena 集成 LeRobotEnvHub现已集成IsaacLabArena实现GPU加速仿真,支持GR1/G1/伽利略人形机器人实体和多种操作任务。安装需满足CUDA GPU、Ubuntu系统和IsaacSim 5.1.0要求,通过conda环境配置依赖项。系统提供SmolVLA和PI0.5等预训练策略评估功能,支持视频录制和并行环境配置。环境配置选项涵盖机器人实体、任务类型、观测维度等参数,并包含针对CUDA内存、视频录制等常见问题的解决方案。此外,LightWheel AI还通过LW-BenchHub引入了包含268 阅读详情

相关推荐

用宝塔面板+CentOS 7.6,30分钟搞定DNF手游私服搭建(附全套资源下载)

本文详细介绍了如何使用宝塔面板和CentOS 7.6在30分钟内快速搭建DNF手游私服。通过图形化界面操作,无需复杂命令,即可完成服务端部署、MySQL数据库配置及客户端适配,适合Linux新手快速上手。

weixin_33737774的博客 599

nginx源码阅读 ---- Event模块和配置的初始化

1.配置文件 event事件模块,配置分为两层:ngx_events_module 事件模块 和 ngx_event_core_module 事件核心模块。 ngx_events_module:模块类型NGX_CORE_MODULE,所以此模块在最外层核心模块解析“events”命令的时候会回调ngx_events_block函数。 ngx_event_core_module:模块类型NGX_EVENT_MODULE,所以此模块在ngx_events_block函数被回调后,才能解析配置信息 最外

alpha_love的博客 381

(一)利用Python实现数据集读取,Python基本文件操作介绍

机器学习是计算机对大量数据的分析过程,在机器学习的实际项目中,通常都需要准备数据集,数据集通常包含的数据数量是庞大的。例如,在处理计算机视觉领域的项目时,每一张图片都是一个单独的文件,为了提高模型训练的效果,图片数量通常会比较多,因此需要合理且高效的操作将所有的图片数据读取。本篇旨在介绍如何用Python对海量文件进行遍历,也是机器学习实践的第一步。.........

ZZR2631574030的博客 6356

【Nginx03】Nginx学习:事件模块Event

Nginx学习:事件模块Event基础的核心模块中,事件模块是非常重要的一个部分,但是,它的配置项其实并不多,常见的或者说需要我们去配置的更少。不过本着基础学习和了解的态度,咱们还是要一个个的学习一下。首先来看一下什么是事件模块。在 Nginx 中,模块相关的配置都是在一对大花括号中的,比如 http{} 、server{} 这些,事件模块也是类似的。events{……………………}事件模块主要...

硬核项目经理 1150

国民技术N32G45X低功耗问题之更改全局变量和栈在RAM中的地址

最近项目中用的MCU是国民技术的N32G45X,MCU的资源很丰富,RAM也很大,配套的库和例程也比较全,用起来还是不错的,但是在调试低功耗的时候还是费了不少劲。 首先由于项目低功耗需要,只能选择停机模式2(STOP2)。根据数据手册的描述,在此模式下外部低速时钟开启, RTC运行, R-SRAM保持,所有I/O状态保持,独立看门狗处于关闭状态,25℃的条件下电流为10个微安。 用的这款MCU的RAM是144KB,分为SRAM(128KB)和R-SRAM( Retention SRAM – 16KB),如果

狂想家 2485

Android SDK 国内镜像及配置方法(2025最新,包好使!)

android sdk 国内镜像配置方法,纯小白避坑指南,2025最新,亲测包好使!还有包奉上!

土豆是狗的博客 4674

Nginx参数配置详细说明【全局、http块、server块、events块】【已亲测】

本文包含Nginx参数配置说明全局块、http块、server块、events块共计30多个参数配置与解释,其中常见参数包含配置错误出现的错误日志,能让你更快的解决问题。 该文的参数大部分经过单独测试,错误都是自己收集出来的,如有疑问可以私聊,文档有误感谢指正,文章对你有帮助请点赞收藏,非常感谢!

BLWY_1124的博客 8157

海康威视摄像机SDK二次开发--提取音频保存至文件

由于最近在开发海康威视摄像头,特此记录一下如何提取音频数据,这里主要依靠语音对讲返回的音频数据,通过回调函数写入文件中,加个WAV头即可播放,编码格式可以自己设置在代码中有注释 文件结构 其中CameraInfo内容可以参看海康威视摄像机SDK二次开发–实时预览视频流保存到指定文件中 HIKSDKSaveRealData中的内容 package ClientDemo; import ClientDemo.CameraInfo; import com.sun.jna.NativeLong; import

RichardoMu的博客 3173

Nginx基础配置详解(main、events、http、server、location)

Nginx基础配置详解(main、events、http、server、location)

StoNENee的博客 2932

C#实现串口通讯程序

1、自动获取本地串口。2、根据传入串口基本属性参数打开串口。3、串口数据的发送接收功能(ASCII和HEX格式)。4、ASCII和HEX相互转换。csharp体验AI代码助手代码解读复制代码[Category("UserProperty")] [Description("轮廓半径")] public int Radius { get => radius;

2401_89221445的博客 1765

Vue3 - vite 项目报错:Uncaught ReferenceError: require is not defined(解决 vue3 vite 项目无法识别 require 语法导致报错)

vue3,vite,报错解决,vue3+vite报错requireisnotdefined,vue3vite引插件不识别require,老插件必须用require怎么办,vite项目插件要求使用require引入但报错,vue3不兼容require导致第三方包插件无法使用,vue3vite中使用require报错怎么办,解决Vite+vue3使用第三方依赖报错“requireisnotdefined”问题,vite项目require语法兼容问题解决requireisnotdefine

🏆 前端领域优质创作者 2万+

Nginx学习(10)—— event模块、core模块、变量

Nginx的模块种类有很多,除了HTTP模块,还有一些核心模块和mail系列模块。核心模块主要是做一些基础功能,比如Nginx的启动初始化,event处理机制,错误日志的初始化,ssl的初始化,正则处理初始化。mail模块可以对imap,pop3,smtp等协议进行反向代理,这些模块本身不对邮件内容进行处理。启动模块从启动Nginx进程开始,做了一系列的初始化工作,源代码位于src/core/nginx.c,从main函数开始

Stars____的博客 946

YOLOv11 改进 - 注意力机制 | LS-YOLO MSFE 多尺度特征提取模块:并行分支结构增强多尺度感知,优化遥感与小目标检测

本文介绍了一种用于滑坡检测的模型LS-YOLO及其在YOLOv11中的结合应用。LS-YOLO首先构建多尺度滑坡数据集MSLD,为模型训练提供丰富数据。设计了基于高效通道注意力、平均池化和空间可分离卷积的多尺度特征提取模块MSFE,充分提取滑坡特征信息。在解耦头中采用膨胀卷积增加模型感受野。我们将MSFE模块集成进YOLOv11,替换部分原有模块。实验表明,改进后的YOLOv11在数据集中表现出色 。

魔改工程师的博客 870

Nginx源码分析(25篇)

1、Nginx源码分析 - 初探Nginx的架构(01) 2、Nginx源码分析 - 基础数据结构篇 - 内存池 ngx_palloc.c(02) 3、Nginx源码分析 - 基础数据结构篇 - 数组结构 ngx_array.c(03) 4、Nginx源码分析 - 基础数据结构篇 - 缓冲区结构 ngx_buf.c(04) 5、Nginx源码分析 - 基础数据结构篇 - 双向链表结构 ngx_queue.c(05) 6、Nginx源码分析 - 基础数据结构篇 - 单向链表结构 ngx_list.c(06)

xiaohuozi2015的博客 5029

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

nginx源码分析——event模块

一、简介      nginx是一款非常受欢迎的软件,具备高性能、模块化可定制的良好特性。之前写了一篇nginx的http模块分析的文章,主要对http处理模块进行了分析讲解,同时也涉及了nginx模块化的内容。至于nginx高性能的原因,希望能够在在这篇文章中就自己对于这方面的理解给大家分享一下。      nginx的event处理模型包含两个方面:高效的IO处理函数,事件的异步处

p77ll9l53x的博客 401

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

nginx源码分析之模块初始化

  在nginx启动过程中,模块的初始化是整个启动过程中的重要部分,而且了解了模块初始化的过程对应后面具体分析各个模块会有事半功倍的效果。在我看来,分析源码来了解模块的初始化是最直接不过的了,所以下面主要通过结合源码来分析模块的初始化过程。   稍微了解nginx的人都知道nginx是高度模块化的,各个功能都封装在模块中,而各个模块的初始化则是根据配置文件来进行的,下面我们会看到nginx边解析...

weixin_33691817的博客 104

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Nginx源码解析

Nginx

qq_20999867的博客 640

nginx源码分析—模块及其初始化

Content 0. 序 1. nginx有哪些模块? 2. nginx如何描述这些模块? 2.1 模块数据结构 2.1.1 ngx_module_t结构 2.1.2 ngx_command_t结构 2.2 模块类图 3. nginx如何组织这些模块? 3.1 全局数组ngx_modules 3.2 模块组织结构图 4. nginx的模块种类 5. nginx如何初始化这些...

weixin_30794499的博客 84

自娱自乐代码人的源码分析系列汇总

ptmalloc源码分析/Lua源码分析/Nginx源码分析/Memcache源码分析

自娱自乐的代码人 5万+

nginx 定时器_Nginx源码分析-定时器的实现及使用

nginx提供一套高效的定时器实现,除了nginx核心能够使用定时器以外,我们在进行模块开发的时候也可以使用定时器来完成一些定时执行的任务。nginx定时器实现的核心是使用一棵红黑树来存储各个定时事件,每次循环的时候就从这棵树里找出超时的事件,然后一一触发,完成定时任务操作。下面简单的描述一下nginx在实现定时器时的几个关键点。本文是基于linux的epoll来描述的定时器实现。定时器初始化ng...

weixin_42201721的博客 501

ngx_event_module_init

ngx_event_module_init

weixin_41812346的博客 41

Nginx源码分析-定时器的实现及使用

  nginx提供一套高效的定时器实现,除了nginx核心能够使用定时器以外,我们在进行模块开发的时候也可以使用定时器来完成一些定时执行的任务。nginx定时器实现的核心是使用一棵红黑树来存储各个定时事件,每次循环的时候就从这棵树里找出超时的事件,然后一一触发,完成定时任务操作。下面简单的描述一下nginx在实现定时器时的几个关键点。本文是基于linux的epoll来描述的定时器实现。 定时器初...

weixin_34092370的博客 99
上一篇: 推荐算法和机器学习系列 - 协同过滤推荐算法和余弦相似性算法
下一篇: Nginx源码分析 - Event事件篇 - Event模块的进程初始化(18)
老码农zhuli
老码农zhuli 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄14年 2456粉丝 312原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值