在windows下编译了包含ngx_lua等扩展的nginx,使用luac字节码时,在代码
https://github.com/chaoslawful/lua-nginx-module/blob/master/src/ngx_http_lua_clfactory.c 的350行 :
if (ngx_fd_info(fileno(lf->f), &fi) == NGX_FILE_ERROR) 条件成立,进入了错误处理。在linux下面没有问题。
查找了下出错的原因:fileno函数在linux和windows下都返回int类型;
ngx_fd_info在unix\ngx_files.h下定义为#define ngx_fd_info(fd, sb) fstat(fd, sb),第一个参数为int类型;
ngx_fd_info在win32\ngx_files.h下定义为#define ngx_fd_info(fd, fi) GetFileInformationByHandle(fd, fi)。 而GetFileInformationByHandle函数的第一个参数类型不是int,而是HANDLE
修改这个if判断,进行类型转换:if (ngx_fd_info((HANDLE)_get_osfhandle(fileno(lf->f)), &fi) == NGX_FILE_ERROR) 。重新编译,字节码的功能在windows就能用了。
但是,在linux下面就有问题了。。。如果要实现跨平台,代码应该怎么写比较好呢?