版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
钢筋混凝土的UNIXC编程技巧(一、内存映射表)前言:大学毕业后从事unix上的银行综合业务系统开发工作已有一年半的时间,向众多前辈高手学习了很多经验和技巧,自己也创新了些好的开发技术,特写出来与奋斗在一线的unix程序员们共享。本人大学时专注于windows平台应用开发,工作后才转入unix平台,故沿袭了不少windows编码风格。--------------------------------------------------------------------------------正文:在一个带有数据库的unix系统中进行E-SQL嵌入式开发,必然用到很多混合式编程方式。当系统对表的SELECT操作频繁时,会使数据库效率大幅下降。于是我们很当然的这样设计:当应用开始运行时把数据库中需要频繁查询的表装载入共享内存,通过编写一批共享内存查询函数实现对表数据的快速查询、定位。这里借用windows的一些名词把这一技术命名为“内存映射表”技术。
内存映射表的格式设计有很多方式,下面介绍一下我设计的一种格式,该格式已经应用于某省级银行信用卡全省大前置系统,取得非常好的效果。|
|
|
|
|
|内存映射表记录条数|第一条记录结构单元|第二条记录结构单元|...|
|10个字节
|记录结构的大小
|记录结构的大小
|
|
|
|
|
|
|共享内存数据存放格式如上图所示。开头的10个字节存放内存映射表的记录条数数值,由于标准c的有符号长整数类型最大值约为21亿,所以预留10个字节存放ASCII编码的记录条数数值已绰绰有余且取得最大限度值了。第11个字节开始存放数据库表第一条记录对应的c语言结构体,称为一个结构单元。后面依次存放所有数据库表记录形成结构体数组。
一张数据库表装载入一块共享内存,可以通过表名给共享内存的ipckey取名。比如“公共系统参数表”对应的内存映射表的ipckey在头文件里这样添加"#defineSHMY_KEY_GGXTCS0x00001138/*4408*/",以便于在程序里引用。
内存映射表共占用共享内存大小为该表记录对应的数据结构体大小乘以记录条数加上10个字节。比如“公共系统参数表”记录条数为10条,表定义如下。那么总占用共享内存大小=(20+30+40)*10+10=910个字节。字段名字段属性长度空值标志备注包括中文注释和取值范围
csxh
char
20
N.N
参数序号
csz
char
30
N.N
参数值
cssm
char
40
参数说明
索引1uniquecsxh内存映射表的操作大致有装载和查询两种操作,其它还可以有简单的更新操作。考虑到每个内存映射表的操作大致一样以及以某个关键字段查询、更新操作的相似性,再以“公共系统参数表”我这样设计内存映射表的操作函数原形:intLoadMapGGXTCS();
intFetchMapGGXTCS(void*pvCondValue,
structREPLACE_STRUCT_TYPE*pREPLACE_STRUCT_ARG,
int(*REPLACE_FUNCNAME_COMPARE_PROC)
(void*pvCondValue,
structREPLACE_STRUCT_TYPE*pREPLACE_STRUCT_ARG
)
);
intUpdateMapGGXTCS(void*pvCondValue,
void*pvUpdateValue,
int(*REPLACE_FUNCNAME_UPDATE_PROC)
(void*pvCondValue,
void*pvUpdateValue,
structREPLACE_STRUCT_TYPE*pREPLACE_STRUCT_ARG
)
);两个函数内所有涉及到具体表名、结构体名、回调函数名我都已宏的方式替换掉,这样做的好处是可以形成代码模板,如果以后要添加一张表的映射只要复制代码模板到实现文件的最后面,把代码模板最前面的宏定义成具体的值。代码模板最后面把所有用过的宏都反定义掉,不妨碍后面的程序使用。
装载表函数我不用多说了,即把表数据装载入共享内存,不需要参数。
查询函数第一个参数为关键字段值,与REPLACE_FUNCNAME_COMPARE_PROC回调函数配合使用。参数类型为void*类型,这样就可以兼容所有类型的数据甚至是结构体、共用体,额外麻烦的只是把变量传入前强制传换成void*,在回调函数里再转换回具体的变量类型。第二个参数是结构体宏,用于函数成功返回时把符合要求的记录结构体返回。第三个参数是指向回调函数的指针,其作用是针对某一关键字段,分别取出共享内存里的每条记录进行比较,当条件符合时,回调函数返回0,否则返回1,这样可以不改变外层遍历函数的条件下,使用不同判断方式、不同的判断值对内存映射表中所有记录进行遍历。
本文最后附件中附有装载、查询和更新三个内存映射表的代码模板,由于完全采用参数化宏替换方式设计,甚至可以不加修改的立即应用到您的系统中去。
下面跳跃的介绍一下查询函数极其回调函数的操作原理。更新函数原理与之相似,结构稍稍复杂一些,重点是回调函数。查询函数
{
...
遍历内存映射表中所有结构记录
{
调用遍历函数最后一个参数即回调函数指针(条件值,当前结构记录);
如果回调函数返回0,即条件符合且更新成功
{
复制内存映射表中当前结构记录内容到pREPLACE_STRUCT_ARG指针空间里,输出给用户
跳出遍历;
}
偏移到内存映射表中下一条结构记录;
}
...
返回回调函数的返回值
}查询回调函数(条件值,内存映射表中当前结构记录)
{
把便利函数传入的条件值强制转换成char*类型;
与内存映射表中当前结构记录的csxh进行比较,如果相等即找到
返回0;
否则
返回1;
}查询函数的使用示例...
/*获取对帐场次*/
iRt=FetchMapGGXTCS((void*)"dzcc",&stGgxtcs,&CompareKeyFromGGXTCSWhereCSXHProc);
if(iRt!=0)
printf("获取对帐场次失败");
else
printf("当前对帐场次为[%s]",stGgxtcs.csz);
...使用该设计通过创建与数据库表映射的共享内存数据提高对数据库静态表(运行时数据内容不改变或者只做少量更新的表)的查询访问速度,而不需要额外占用数据库宝贵的效率,尤其在一个对数据库操作频繁的系统中能很大程度的提高整个系统的运行效率。本设计也有不足之处,主要是只能代替数据库简单的SELECT操作和UPDATE操作,不支持INSERT、DELETE操作,不过对于一些静态表的查询使用已经足够了,不是吗^___^--------------------------------------------------------------------------------附件一、内存映射表代码模块(以“公共系统参数表”为例)/********************************************
**获取公共系统参数表内存映射表相应记录**
********************************************/#defineREPLACE_STRUCT_TYPEggxtcs
#defineREPLACE_STRUCT_ARGstGgxtcs
#defineREPLACE_SHEKEYSHMY_KEY_GGXTCS
#defineREPLACE_TABLENAMEggxtcs
#defineREPLACE_TABLEDESC"公共系统参数表"
#defineREPLACE_CURSORNAMEcurGGXTCS
#defineREPLACE_DBVARR_GGXTCS
#defineREPLACE_DBVARFUNCpubVtoSGgxtcs
#defineREPLACE_FUNCNAME_FETCH"FetchMapGGXTCS"
#defineREPLACE_FUNCNAME_LOAD"LoadMapGGXTCS"
#defineREPLACE_FUNCNAME_COMPARE_PROCCompareKeyFromGGXTCSProc
#defineREPLACE_FUNCNAME_UPDATE_PROCUpdateValueFromGGXTCSProcintFetchMapGGXTCS(void*pvCondValue,
structREPLACE_STRUCT_TYPE*pREPLACE_STRUCT_ARG,
int(*REPLACE_FUNCNAME_COMPARE_PROC)
(void*pvCondValue,
structREPLACE_STRUCT_TYPE*pREPLACE_STRUCT_ARG
)
);
{
intiReturnValue;structREPLACE_STRUCT_TYPE*pmpREPLACE_STRUCT_ARG;
char*pmp;
characRecordAmount[11];
longlRecordAmount;
longl;_IPC_ID_Tipcid;/*判断内存映射表是否存在*/
iReturnValue=IPCIsShareMemoryExist(REPLACE_SHEKEY);if(iReturnValue==IPC_SHAREMEMORY_RETURN_ISNT_EXIST)
{
/*若不存在则创建之*/
iReturnValue=LoadMapGGXTCS();if(iReturnValue!=0)
{
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_FETCH"|"LOG_LINELEN"|创建内存映射表"REPLACE_TABLEDESC"失败错误码[%d]errno[%d],请重启应用\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
iReturnValue,
errno);return-1;
}
}/*打开内存映射表*/
ipcid=IPCOpenShareMemory(REPLACE_SHEKEY);if(ipcid<0)
{
/*打开失败,写出错日志,函数返回*/
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_FETCH"|"LOG_LINELEN"|打开内存映射表"REPLACE_TABLEDESC"失败errno[%d],请重启应用\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
errno);return-2;
}/*连接内存映射表地址*/
pmp=IPCAttachShareMemory(ipcid);if(pmp==NULL)
{
/*连接失败,写出错日志,函数返回*/
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_FETCH"|"LOG_LINELEN"|连接内存映射表"REPLACE_TABLEDESC"失败errno[%d],请重启应用\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
errno);return-3;
}memset(acRecordAmount,0x00,sizeof(acRecordAmount));
strncpy(acRecordAmount,pmp,10);
lRecordAmount=atol(acRecordAmount);pmpREPLACE_STRUCT_ARG=(structREPLACE_STRUCT_TYPE*)(pmp+10);/*搜寻内存映射表*/
for(l=0;l<lRecordAmount;l++)
{
/*调用搜寻回调函数*/
iReturnValue=REPLACE_FUNCNAME_COMPARE_PROC(pvCondValue,pmpREPLACE_STRUCT_ARG);if(iReturnValue!=1)
{
memset(pREPLACE_STRUCT_ARG,0x00,sizeof(structREPLACE_STRUCT_TYPE));
memcpy(pREPLACE_STRUCT_ARG,pmpREPLACE_STRUCT_ARG,sizeof(structREPLACE_STRUCT_TYPE));break;
}pmpREPLACE_STRUCT_ARG++;
}/*断开内存映射表地址连接*/
IPCDetachShareMemory(pmp);returniReturnValue;
}/***********************************
**更新公共系统参数表内存映射表**
***********************************/intUpdateMapGGXTCS(void*pvCondValue,
void*pvUpdateValue,
int(*REPLACE_FUNCNAME_UPDATE_PROC)
(void*pvCondValue,
void*pvUpdateValue,
structREPLACE_STRUCT_TYPE*pREPLACE_STRUCT_ARG
)
);
{
intiReturnValue;structREPLACE_STRUCT_TYPE*pmpREPLACE_STRUCT_ARG;
char*pmp;
characRecordAmount[11];
longlRecordAmount;
longl;_IPC_ID_Tipcid;/*判断内存映射表是否存在*/
iReturnValue=IPCIsShareMemoryExist(REPLACE_SHEKEY);if(iReturnValue==IPC_SHAREMEMORY_RETURN_ISNT_EXIST)
{
/*若不存在则创建之*/
iReturnValue=LoadMapGGXTCS();if(iReturnValue!=0)
{
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_FETCH"|"LOG_LINELEN"|创建内存映射表"REPLACE_TABLEDESC"失败错误码[%d]errno[%d],请重启应用\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
iReturnValue,
errno);return-1;
}
}/*打开内存映射表*/
ipcid=IPCOpenShareMemory(REPLACE_SHEKEY);if(ipcid<0)
{
/*打开失败,写出错日志,函数返回*/
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_FETCH"|"LOG_LINELEN"|打开内存映射表"REPLACE_TABLEDESC"失败errno[%d],请重启应用\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
errno);return-2;
}/*连接内存映射表地址*/
pmp=IPCAttachShareMemory(ipcid);if(pmp==NULL)
{
/*连接失败,写出错日志,函数返回*/
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_FETCH"|"LOG_LINELEN"|连接内存映射表"REPLACE_TABLEDESC"失败errno[%d],请重启应用\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
errno);return-3;
}memset(acRecordAmount,0x00,sizeof(acRecordAmount));
strncpy(acRecordAmount,pmp,10);
lRecordAmount=atol(acRecordAmount);pmpREPLACE_STRUCT_ARG=(structREPLACE_STRUCT_TYPE*)(pmp+10);/*搜寻内存映射表*/
for(l=0;l<lRecordAmount;l++)
{
/*调用搜寻回调函数*/
iReturnValue=REPLACE_FUNCNAME_UPDATE_PROC(pvCondValue,pvUpdateValue,pmpREPLACE_STRUCT_ARG);if(iReturnValue!=1)
{
break;
}pmpREPLACE_STRUCT_ARG++;
}/*断开内存映射表地址连接*/
IPCDetachShareMemory(pmp);returniReturnValue;
}/***********************************
**装载公共系统参数表内存映射表**
***********************************/intLoadMapGGXTCS()
{
intiReturnValue;struct
REPLACE_STRUCT_TYPEREPLACE_STRUCT_ARG;
struct
REPLACE_STRUCT_TYPE*pmpREPLACE_STRUCT_ARG;
char*pmp;_IPC_ID_Tipcid;longlMapSize;memset(&REPLACE_STRUCT_ARG,0x00,sizeof(structREPLACE_STRUCT_TYPE));/*获取表记录总条数*/
EXECSQL
SELECTcount(*)
INTO:dlRecordAmount
FROMREPLACE_TABLENAME;if(sqlca.sqlcode)
{
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_LOAD"|"LOG_LINELEN"|获取"REPLACE_TABLEDESC"总记录数失败sqlcode[%d]\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
sqlca.sqlcode);return-1;
}/*计算内存映射表大小*/
/*前十个字节为储存头,存放储存单元的个数*/
lMapSize=dlRecordAmount*sizeof(struct
REPLACE_STRUCT_TYPE)+10;/*创建内存映射表*/
ipcid=IPCCreateShareMemory(REPLACE_SHEKEY,lMapSize);if(ipcid<0)
{
if(errno==EEXIST)
return0;WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_LOAD"|"LOG_LINELEN"|创建内存映射表"REPLACE_TABLEDESC"失败errno[%d],请重启应用\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
errno);return-2;
}/*定义游标*/
EXECSQL
DECLAREREPLACE_CURSORNAMECURSORFOR
SELECT*
FROMREPLACE_TABLENAME;/*打开游标*/
EXECSQL
OPENREPLACE_CURSORNAME;/*打开游标失败*/
if(sqlca.sqlcode)
{
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_LOAD"|"LOG_LINELEN"|打开游标"REPLACE_TABLEDESC"失败sqlcode[%d]\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
sqlca.sqlcode);return-3;
}/*连接内存映射表地址*/
pmp=IPCAttachShareMemory(ipcid);if(pmp==NULL)
{
/*连接失败,写出错日志,函数返回*/
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_LOAD"|"LOG_LINELEN"|连接内存映射表"REPLACE_TABLEDESC"失败errno[%d],请重启应用\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
errno);return-4;
}sprintf(pmp,"%-010d",dlRecordAmount);
pmpREPLACE_STRUCT_ARG=(structREPLACE_STRUCT_TYPE*)(pmp+10);while(1)
{
/*获取游标*/
EXECSQL
FETCHREPLACE_CURSORNAME
INTOREPLACE_DBVAR;/*如果记录已取完,跳出循环*/
if(sqlca.sqlcode==100)
break;/*获取游标失败*/
if(sqlca.sqlcode!=0)
{
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_LOAD"|"LOG_LINELEN"|获取游标"REPLACE_TABLEDESC"失败sqlcode[%d],请重启应用\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
sqlca.sqlcode);/*断开内存映射表地址连接*/
IPCDetachShareMemory(pmp);/*关闭游标*/
EXECSQLCLOSEREPLACE_CURSORNAME;return-5;
}REPLACE_DBVARFUNC(&REPLACE_STRUCT_ARG);memcpy(pmpREPLACE_STRUCT_ARG,&REPLACE_STRUCT_ARG,sizeof(structREPLACE_STRUCT_TYPE));
pmpREPLACE_STRUCT_ARG++;
}/*断开内存映射表地址连接*/
IPCDetachShareMemory(pmp);/*关闭游标*/
EXECSQLCLOSEREPLACE_CURSORNAME;WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_LOAD"|"LOG_LINELEN"|%ld条记录进入内存映射表"REPLACE_TABLEDESC"\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
dlRecordAmount);return0;
}#undefREPLACE_STRUCT_TYPE
#undefREPLACE_STRUCT_ARG
#undefREPLACE_SHEKEY
#undefREPLACE_TABLENAME
#undefREPLACE_TABLEDESC
#undefREPLACE_CURSORNAME
#undefREPLACE_DBVAR
#undefREPLACE_DBVARFUNC
#undefREPLACE_FUNCNAME_FETCH
#undefREPLACE_FUNCNAME_LOAD
#undefREPLACE_FUNCNAME_COMPARE_PROC
#undefREPLACE_FUNCNAME_UPDATE_PROC附件二、下面这些函数被上面的程序调用过,代码存放在本人设计的iIPC、iLibX基础函数库中。/*
**函数名:IPCIsShareMemoryExist
**函数描述:判断共享存储块存在
**输入参数说明:_IPC_ID_Tipckey共享存储块的id
**返回值:存在返回IPC_SHAREMEMORY_RETURN_EXIST
**不存在返回IPC_SHAREMEMORY_RETURN_ISNT_EXIST
*/intIPCIsShareMemoryExist(_IPC_KEY_Tipckey)
{
_IPC_ID_Tipcid;ipcid=shmget(ipckey,1,IPC_CREAT|IPC_EXCL|_giIPCPermission);if(ipcid==-1)
returnIPC_SHAREMEMORY_RETURN_EXIST;IPCDestroyShareMemory(ipcid);returnIPC_SHAREMEMORY_RETURN_ISNT_EXIST;
}/*
**函数名:IPCOpenShareMemory
**函数描述:打开共享存储块
**输入参数说明:_IPC_KEY_Tipckey共享存储块的key
**返回值:成功,返回共享存储块的id
**失败,返回错误代码
*/_IPC_ID_TIPCOpenShareMemory(_IPC_KEY_Tipckey)
{
intiReturnValue;
_IPC_ID_Tipcid;iReturnValue=IPCIsShareMemoryExist(ipckey);if(iReturnValue==IPC_SHAREMEMORY_RETURN_ISNT_EXIST)
returnIPC_SHAREMEMORY_RETURN_ISNT_EXIST;ipcid=shmget(ipckey,0,IPC_CREAT|_giIPCPermission);if(ipcid==-1)
returnIPC_SHAREMEMORY_ERROR_CANT_OPEN;returnipcid;
}/*
**函数名:IPCAttachShareMemory
**函数描述:连接共享存储块首地址
**输入参数说明:_IPC_ID_Tipcid共享存储块的id
**返回值:存在返回首地址
**不存在返回NULL
*/void*IPCAttachShareMemory(_IPC_ID_Tipcid)
{
void*pvAttach;pvAttach=shmat(ipcid,NULL,0);if(pvAttach==(void*)-1)
returnNULL;
else
returnpvAttach;
}/*
**函数名:IPCDetachShareMemory
**函数描述:断开共享存储块首地址
**输入参数说明:void*pvDetach共享存储块连接首地址
**返回值:存在返回IPC_SHAREMEMORY_RETURN_SUCCESS
**不存在返回IPC_SHAREMEMORY_ERROR_CANT_DETACH
*/intIPCDetachShareMemory(void*pvDetach)
{
inti;i=shmdt(pvDetach);if(i==-1)
returnIPC_SHAREMEMORY_ERROR_CANT_DETACH;
else
returnIPC_SHAREMEMORY_RETURN_SUCCESS;
}/*
**函数名:WriteLog
**函数描述:正常写日志函数
**输入参数说明:char*pcLogFileName日志文件名
**char*pcFormatString日志格式串
**...日志参数列表
**返回值:成功,返回TRUE
**失败,返回FALSE
**更新日志:2003/10/18创建
*/BOOLWriteLog(char*pcLogFileName,char*pcFormatString,...)
{
va_listvalist;
BOOLret;va_start(valist,pcFormatString);ret=DoLog(pcLogFileName,LOG_WRITE_APPEND,LOG_MODE_RETURN,pcFormatString,valist);va_end(valist);returnret;
}/*
**函数名:DoLog
**函数描述:日志记录原始函数
**输入参数说明:char*pcLogFileName日志文件名
**intiWriteFlag日志写标志
**intiModeFlag日志写完后操作标志
**char*pcFormatString日志格式串
**va_listvalist日志参数列表
**返回值:成功,返回TRUE
**失败,返回FALSE
**更新日志:2003/10/18创建
*/BOOLDoLog(char*pcLogFileName,intiWriteFlag,intiModeFlag,char*pcFormatString,va_listvalist)
{
FILE*fpLogFile=NULL;if(iWriteFlag==LOG_WRITE_NEW)
fpLogFile=fopen(pcLogFileName,"w");
elseif(iWriteFlag==LOG_WRITE_APPEND)
fpLogFile=fopen(pcLogFileName,"a");if(fpLogFile==NULL)
returnFALSE;if(vfprintf(fpLogFile,pcFormatString,valist)<0)
returnFALSE;fflush(fpLogFile);fclose(fpLogFile);if(iModeFlag==LOG_MODE_RETURN)
returnTRUE;
elseif(iModeFlag==LOG_MODE_EXIT)
exit(0);returnTRUE;
}/*
**函数名:GetLocalTimeString
**函数描述:格式化时间字符串(本地时间)
**输入参数说明:size_tbufsize用于存放格式化后字符串的缓冲区大小
**constchar*format格式化串
**输出参数说明char*buf用于存放格式化后字符串的缓冲区首地址(建议预分配256字节)
**返回值:成功,返回TRUE
**失败,返回FALSE
**更新日志:2003/10/18创建
**2004/3/3修改格式化后字符串的缓冲区首地址原型
*/char*GetLocalTimeString(char*buf,size_tbufsize,constchar*format)
{
structtm*time_tm;time_tm=GetLocalTimeStruct();if(strftime(buf,bufsize,format,time_tm)!=0)
returnbuf;
else
returnNULL;
}/*
**函数名:GetLocalTimeStruct
**函数描述:把UNIX纪元到现在的秒数以structtm结构的形式返回(本地时间)
**返回值:秒数
**更新日志:2003/10/18创建
*/structtm*GetLocalTimeStruct()
{
time_ttime_cl;time(&time_cl);returnlocaltime(&time_cl);
}弯起钢筋bent-upsteelbar混凝土结构构件的下部(或上部)纵向受拉钢筋,按规定的部位和角度弯至构件上部(或下部)后,并满足锚固要求的钢筋。梁中弯起钢筋构造要求:根据《混凝土结构设计规范》,在采用绑扎骨架的钢筋混凝土梁中,当设置弯起钢筋时,弯起钢筋的弯终点外应留有锚固长度,其长度在受拉区不应小于20d,在受压区不应小于10d;对光面钢筋在末端应设置弯钩。位于梁底层两侧的钢筋不应弯起。弯起钢筋的作用:弯起钢筋在跨中附近和纵向受拉钢筋一样可以承担正弯矩;在支座附近弯起后,其弯起段可以承受弯矩和剪力共同产生的主拉应力;弯起后的水平段有时还可以承受支座处的负弯矩。架立钢筋erectionbar为满足构造上或施工上的要求而设置的定位钢筋。作用是把主要的受力钢筋(如主钢筋,箍筋等)固定在正确的位置上,并与主钢筋连成钢筋骨架,从而充分发挥各自的受力特性。架立钢筋的直径一般在10~14毫米之间。架立钢筋在梁中的最小直径梁的跨度(m)架立钢筋直径(mm)L<4≥84≤L≤6≥10L>6≥12受力钢筋钢筋混凝土结构中,按结构计算,承受拉力或压力的钢筋,是所配置钢筋中的主要部分。负弯矩1、什么是负弯矩:在弯矩图上,向上弯起的弯矩是正弯矩,反之,向下弯起的弯矩就是负弯矩;打个比方,你用手拗一只筷子,向下拗的时候,是筷子下部先断;这是正弯矩,向上拗的时候,是是筷子上部先断,这是负弯矩;明白了正负弯的区别,你就可以往下看了;2、为抵抗负弯矩而设置的钢筋就叫负弯矩筋,在工地上常常简称为“负筋”,一般来说,常碰到的负弯矩筋有两种,一种是楼板与
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贸易补偿借款合同范本2
- 牙科正畸治疗中的力学原理应用
- 2025农村土地使用转让合同格式
- 2025模型加工合同范文
- 高校学风与教学管理的优化策略
- 2025设计优化咨询合同
- 2024年度智能语音识别与交互软件合作开发协议3篇
- 茶叶除草合同范例
- 工厂装修协议合同范例
- 商丘工学院《高分子基础专业理论教学》2023-2024学年第一学期期末试卷
- 2023北京西城五年级(上)期末英语试卷含答案
- 萧山区八年级上学期期末语文试题(含解析)
- 2024中国远洋海运集团校园招聘995人高频考题难、易错点模拟试题(共500题)附带答案详解
- 施工合同范本Word模板下载(多篇)
- (打印版)小学二年级上-连加连减加减混合带小括号-练习题
- 小组合作学习在初中道德与法治程中的应用研究
- 八年级上册数学期末复习计划
- 房屋结构安全隐患排查整治
- 《无偿献血招募》课件
- 酒店精装修工程技术要求
- 周期性麻痹学习课件
评论
0/150
提交评论