offsetof相关知识
-
offsetof与container_of宏分析offsetof宏:结构体成员相对结构体的偏移位置container_of:根据结构体成员的地址来获取结构体的地址offsetof 宏原型:#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)(TYPE *)0非常巧妙,告诉编译器有一个指向结构体 TYPE 的指针,其地址是0,然后取该指针的 MEMBER 地址 &((TYPE *)0)->MEMBER,因为基址是0,所以这时获取到的 MEMBER 的地址就是相当于在结构体 TYPE 中的偏移量了。Example:#include <stdlib.h>#include <stdio.h>#include <stddef.h>struct TYPE{ int mem; &
-
从NPM到CNPM引用NPM网站上的一句话:npm loves you ! NPM是Nodejs的包管理工具,目前NPM社区包的数量已超越C、C++,已然成为全球最大的代码工厂; 安装Nodejs后即可开始NPM之旅了,新建一个package.json或者通过npm init,来更好的为NPM服务;配置package.json的dependencies属性和devDependencies属性,指定生产环境和开发环境所
-
# Leetcode 14:Longest Common Prefix 最长公共前缀Write a function to find the longest common prefix string amongst an array of strings. If there is no common prefix, return an empty string "". 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 Example 1: Input: ["flower","flow","flight"] Output: "fl" Example 2: Input: ["dog","racecar","car"] Output: "" Explanation: There is no common prefix among the input strings. Note:
-
Linux 上好用的 R 语言 IDE前一段时间,我已经介绍过 Linux 上针对 C/C++ 语言的最好 IDE。很显然 C 或 C++ 并不是现存的唯一的编程语言,是时间讨论某些更加特别的语言了。假如你做过一些统计工作,很可能你已经见识过 R 语言 了。假如你还没有,我真的非常推荐这门专为统计和数据挖掘而生的开源编程语言。若你拥有编程背景,它的语法可能会使你感到有些不适应,但希望它的向量化操作所带来的快速能够吸引到你。简而言之,请尝试使用一下这门语言。而要做到这一点,使用一个好的 IDE 来入门或许会更好。R 作为一门跨平台的语言,有着一大把好用的 IDE,它们使得用 R 语言进行数据分析变得更惬意。假如你非常钟意一个特定的编辑器,这里也有一些好用的插件来将它转变为一个成熟的 R 语言的 IDE。下面就让我们见识一下 Linux 环境下 5 个针对 R 语言的好用 IDE吧。1. RStudio就让我们以或许是最为人们喜爱的 R IDE —— RStudio 来开始我们的介绍吧。除了一般 IDE 所提供的诸如语法高亮、代码补全等功能,RSt
offsetof相关课程
offsetof相关教程
- 1.4 如何编写自己的模块 想要编写 Nginx 模块,首先需要对 Nginx 模块中的源码以及相关的数据结构有所了解,还要知晓 Nginx HTTP 模块的调用流程。假设我要实现前面第三方模块Echo的最简单形式,即只输出相应的字符串即可。假定模块支持的指令名称还是 echo, 这个 echo 指令需要跟一个参数,即输出的字符串。我们需要做如下几步:确定模块名称,以及模块中的指令以及参数,还有运行的环境。这里涉及的结构是 ngx_command_t,它定义了模块里的所有指令格式。下面的代码表示该模块中只有一个 echo 指令,它出现的上下文环境为 location,且有一个参数(NGX_CONF_TAKE1)。当某个配置块中出现echo指令时,Nginx 将调用ngx_http_echo方法。然后在该方法中,会设置处理请求的 handler,这个 handler 就是处理请求的方法。 static ngx_command_t ngx_http_echo_commands[] = { { ngx_string("echo"), /* 指令名称,利用ngx_string宏定义 */ NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, /* 用在 location 指令块内,且有1个参数 */ ngx_http_echo, /* 处理回调函数 */ NGX_HTTP_LOC_CONF_OFFSET, offsetof(ngx_http_echo_loc_conf_t, ed), /* 指定参数读取位置 */ NULL }, ngx_null_command };完成请求处理的 handler 函数,最重要的部分就在这里; static char * ngx_http_echo(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_http_core_loc_conf_t *clcf; /* 找到指令所属的配置块,这里我们限定echo指令的上下文环境只有location */ clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); /* 指定处理的handler */ clcf->handler = ngx_http_echo_handler; ... return NGX_CONF_OK; } static ngx_int_t ngx_http_echo_handler(ngx_http_request_t *r) { ... /* 向用户发送相应包 */ return ngx_http_output_filter(r, &out); }一些收尾工作,比如配置模块介入 http 请求的哪些阶段等。 /* Http context of the module */ static ngx_http_module_t ngx_http_echo_module_ctx = { NULL, /* preconfiguration */ NULL, /* postconfiguration */ NULL, /* create main configuration */ NULL, /* init main configuration */ NULL, /* create server configuration */ NULL, /* merge server configuration */ ngx_http_echo_create_loc_conf, /* create location configration */ ngx_http_echo_merge_loc_conf /* merge location configration */ }; /* Module */ ngx_module_t ngx_http_echo_module = { NGX_MODULE_V1, &ngx_http_echo_module_ctx, /* module context */ ngx_http_echo_commands, /* module directives */ NGX_HTTP_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 };完成以上几步,一个简易的自定义模块就算大功告成了。接下来我们动手完成第一个自定义的模块,将其编译进Nginx 二进制文件中并进行测试。
- 2. 案例 我们来完成一个简单的自定义 http 模块,来实现前面Echo模块的最简单形式,即使用指令输出 “hello, world” 字符串。首先新建一个目录echo-nginx-module,然后在目录下新建两个文件config和ngx_http_echo_module.c[root@server echo-nginx-module]# pwd/root/shencong/echo-nginx-module[root@server echo-nginx-module]# lsconfig ngx_http_echo_module.c两个文件内容分别如下:[root@server echo-nginx-module]# cat config ngx_addon_name=ngx_http_echo_module# 指定模块名称HTTP_MODULES="$HTTP_MODULES ngx_http_echo_module"# 指定模块源码路径NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_echo_module.c"[root@server echo-nginx-module]# cat ngx_http_echo_module.c#include <ngx_config.h>#include <ngx_core.h>#include <ngx_http.h>/* Module config */typedef struct { ngx_str_t ed;} ngx_http_echo_loc_conf_t;static char *ngx_http_echo(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);static void *ngx_http_echo_create_loc_conf(ngx_conf_t *cf);static char *ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child);/* 定义指令 */static ngx_command_t ngx_http_echo_commands[] = { { ngx_string("echo"), /* 指令名称,利用ngx_string宏定义 */ NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, /* 用在 location 指令块内,且有1个参数 */ ngx_http_echo, /* 处理回调函数 */ NGX_HTTP_LOC_CONF_OFFSET, offsetof(ngx_http_echo_loc_conf_t, ed), /* 指定参数读取位置 */ NULL }, ngx_null_command};/* Http context of the module */static ngx_http_module_t ngx_http_echo_module_ctx = { NULL, /* preconfiguration */ NULL, /* postconfiguration */ NULL, /* create main configuration */ NULL, /* init main configuration */ NULL, /* create server configuration */ NULL, /* merge server configuration */ ngx_http_echo_create_loc_conf, /* create location configration */ ngx_http_echo_merge_loc_conf /* merge location configration */};/* Module */ngx_module_t ngx_http_echo_module = { NGX_MODULE_V1, &ngx_http_echo_module_ctx, /* module context */ ngx_http_echo_commands, /* module directives */ NGX_HTTP_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};/* Handler function */static ngx_int_tngx_http_echo_handler(ngx_http_request_t *r){ ngx_int_t rc; ngx_buf_t *b; ngx_chain_t out; ngx_http_echo_loc_conf_t *elcf; /* 获取指令的参数 */ elcf = ngx_http_get_module_loc_conf(r, ngx_http_echo_module); if(!(r->method & (NGX_HTTP_HEAD|NGX_HTTP_GET|NGX_HTTP_POST))) { /* 如果不是 HEAD/GET/PUT 请求,则返回405 Not Allowed错误 */ return NGX_HTTP_NOT_ALLOWED; } r->headers_out.content_type.len = sizeof("text/html") - 1; r->headers_out.content_type.data = (u_char *) "text/html"; r->headers_out.status = NGX_HTTP_OK; r->headers_out.content_length_n = elcf->ed.len; if(r->method == NGX_HTTP_HEAD) { rc = ngx_http_send_header(r); if(rc != NGX_OK) { return rc; } } b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); if(b == NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate response buffer."); return NGX_HTTP_INTERNAL_SERVER_ERROR; } out.buf = b; out.next = NULL; b->pos = elcf->ed.data; b->last = elcf->ed.data + (elcf->ed.len); b->memory = 1; b->last_buf = 1; rc = ngx_http_send_header(r); if(rc != NGX_OK) { return rc; } /* 向用户发送相应包 */ return ngx_http_output_filter(r, &out);}static char *ngx_http_echo(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){ ngx_http_core_loc_conf_t *clcf; clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); /* 指定处理的handler */ clcf->handler = ngx_http_echo_handler; ngx_conf_set_str_slot(cf,cmd,conf); return NGX_CONF_OK;}static void *ngx_http_echo_create_loc_conf(ngx_conf_t *cf){ ngx_http_echo_loc_conf_t *conf; conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_echo_loc_conf_t)); if (conf == NULL) { return NGX_CONF_ERROR; } conf->ed.len = 0; conf->ed.data = NULL; return conf;}static char *ngx_http_echo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child){ ngx_http_echo_loc_conf_t *prev = parent; ngx_http_echo_loc_conf_t *conf = child; ngx_conf_merge_str_value(conf->ed, prev->ed, ""); return NGX_CONF_OK;}这样一个第三方模块包就完成了,接下来我们要向之前使用第三方模块一样,将它编译进 Nginx,具体操作如下。[root@server shencong]# cd nginx-1.17.6/[root@server nginx-1.17.6]# ./configure --prefix=/root/shencong/nginx-echo --add-module=/root/shencong/echo-nginx-module...[root@server nginx-1.17.6] # make && make install...[root@server nginx-1.17.6]# cd ../nginx-echo/sbin/[root@server sbin]# ./nginx -Vnginx version: nginx/1.17.6built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) configure arguments: --prefix=/root/shencong/nginx-echo --add-module=/root/shencong/echo-nginx-module接下来,我们只要在 nginx.conf 中加入我们的指令,并给一个参数,就能看到我们自定义的输出了。...http { ... server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } location /test { echo hello,world; } ... }}...最后我们请求主机的80端口,URI=/test,浏览器输出"hello, world",说明我们的自定义模块成功了!
- 3-5 干系人与项目管理铁三角 各方向通用的项目管理实战
- Class 文件中的字段表、方法表与属性表 JVM 是 Java 开发者必须要掌握的知识。
- 5.基于BCrypt实现用户信息加密与注册功能实现 移动端架构师电子书
- 12-4 【实践】编写项目沟通计划表 各方向通用的项目管理实战
offsetof相关搜索
-
oauth
object
object c
objective
objective c
objective c基础教程
objective c教程
objectivec
office visio 2003
offsetof
offsetparent
offset函数
okhttp
on on
on time
onbeforeunload
onblur
onclick
oncontextmenu
online