版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
鋼筋混凝土的UNIXC編程技巧(一、內(nèi)存映射表)前言:大學畢業(yè)后從事unix上的銀行綜合業(yè)務系統(tǒng)開發(fā)工作已有一年半的時間,向眾多前輩高手學習了很多經(jīng)驗和技巧,自己也創(chuàng)新了些好的開發(fā)技術,特寫出來與奮斗在一線的unix程序員們共享。本人大學時專注于windows平臺應用開發(fā),工作后才轉(zhuǎn)入unix平臺,故沿襲了不少windows編碼風格。--------------------------------------------------------------------------------正文:在一個帶有數(shù)據(jù)庫的unix系統(tǒng)中進行E-SQL嵌入式開發(fā),必然用到很多混合式編程方式。當系統(tǒng)對表的SELECT操作頻繁時,會使數(shù)據(jù)庫效率大幅下降。于是我們很當然的這樣設計:當應用開始運行時把數(shù)據(jù)庫中需要頻繁查詢的表裝載入共享內(nèi)存,通過編寫一批共享內(nèi)存查詢函數(shù)實現(xiàn)對表數(shù)據(jù)的快速查詢、定位。這里借用windows的一些名詞把這一技術命名為“內(nèi)存映射表”技術。
內(nèi)存映射表的格式設計有很多方式,下面介紹一下我設計的一種格式,該格式已經(jīng)應用于某省級銀行信用卡全省大前置系統(tǒng),取得非常好的效果。|
|
|
|
|
|內(nèi)存映射表記錄條數(shù)|第一條記錄結構單元|第二條記錄結構單元|...|
|10個字節(jié)
|記錄結構的大小
|記錄結構的大小
|
|
|
|
|
|
|共享內(nèi)存數(shù)據(jù)存放格式如上圖所示。開頭的10個字節(jié)存放內(nèi)存映射表的記錄條數(shù)數(shù)值,由于標準c的有符號長整數(shù)類型最大值約為21億,所以預留10個字節(jié)存放ASCII編碼的記錄條數(shù)數(shù)值已綽綽有余且取得最大限度值了。第11個字節(jié)開始存放數(shù)據(jù)庫表第一條記錄對應的c語言結構體,稱為一個結構單元。后面依次存放所有數(shù)據(jù)庫表記錄形成結構體數(shù)組。
一張數(shù)據(jù)庫表裝載入一塊共享內(nèi)存,可以通過表名給共享內(nèi)存的ipckey取名。比如“公共系統(tǒng)參數(shù)表”對應的內(nèi)存映射表的ipckey在頭文件里這樣添加"#defineSHMY_KEY_GGXTCS0x00001138/*4408*/",以便于在程序里引用。
內(nèi)存映射表共占用共享內(nèi)存大小為該表記錄對應的數(shù)據(jù)結構體大小乘以記錄條數(shù)加上10個字節(jié)。比如“公共系統(tǒng)參數(shù)表”記錄條數(shù)為10條,表定義如下。那么總占用共享內(nèi)存大小=(20+30+40)*10+10=910個字節(jié)。字段名字段屬性長度空值標志備注包括中文注釋和取值范圍
csxh
char
20
N.N
參數(shù)序號
csz
char
30
N.N
參數(shù)值
cssm
char
40
參數(shù)說明
索引1uniquecsxh內(nèi)存映射表的操作大致有裝載和查詢兩種操作,其它還可以有簡單的更新操作??紤]到每個內(nèi)存映射表的操作大致一樣以及以某個關鍵字段查詢、更新操作的相似性,再以“公共系統(tǒng)參數(shù)表”我這樣設計內(nèi)存映射表的操作函數(shù)原形: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
)
);兩個函數(shù)內(nèi)所有涉及到具體表名、結構體名、回調(diào)函數(shù)名我都已宏的方式替換掉,這樣做的好處是可以形成代碼模板,如果以后要添加一張表的映射只要復制代碼模板到實現(xiàn)文件的最后面,把代碼模板最前面的宏定義成具體的值。代碼模板最后面把所有用過的宏都反定義掉,不妨礙后面的程序使用。
裝載表函數(shù)我不用多說了,即把表數(shù)據(jù)裝載入共享內(nèi)存,不需要參數(shù)。
查詢函數(shù)第一個參數(shù)為關鍵字段值,與REPLACE_FUNCNAME_COMPARE_PROC回調(diào)函數(shù)配合使用。參數(shù)類型為void*類型,這樣就可以兼容所有類型的數(shù)據(jù)甚至是結構體、共用體,額外麻煩的只是把變量傳入前強制傳換成void*,在回調(diào)函數(shù)里再轉(zhuǎn)換回具體的變量類型。第二個參數(shù)是結構體宏,用于函數(shù)成功返回時把符合要求的記錄結構體返回。第三個參數(shù)是指向回調(diào)函數(shù)的指針,其作用是針對某一關鍵字段,分別取出共享內(nèi)存里的每條記錄進行比較,當條件符合時,回調(diào)函數(shù)返回0,否則返回1,這樣可以不改變外層遍歷函數(shù)的條件下,使用不同判斷方式、不同的判斷值對內(nèi)存映射表中所有記錄進行遍歷。
本文最后附件中附有裝載、查詢和更新三個內(nèi)存映射表的代碼模板,由于完全采用參數(shù)化宏替換方式設計,甚至可以不加修改的立即應用到您的系統(tǒng)中去。
下面跳躍的介紹一下查詢函數(shù)極其回調(diào)函數(shù)的操作原理。更新函數(shù)原理與之相似,結構稍稍復雜一些,重點是回調(diào)函數(shù)。查詢函數(shù)
{
...
遍歷內(nèi)存映射表中所有結構記錄
{
調(diào)用遍歷函數(shù)最后一個參數(shù)即回調(diào)函數(shù)指針(條件值,當前結構記錄);
如果回調(diào)函數(shù)返回0,即條件符合且更新成功
{
復制內(nèi)存映射表中當前結構記錄內(nèi)容到pREPLACE_STRUCT_ARG指針空間里,輸出給用戶
跳出遍歷;
}
偏移到內(nèi)存映射表中下一條結構記錄;
}
...
返回回調(diào)函數(shù)的返回值
}查詢回調(diào)函數(shù)(條件值,內(nèi)存映射表中當前結構記錄)
{
把便利函數(shù)傳入的條件值強制轉(zhuǎn)換成char*類型;
與內(nèi)存映射表中當前結構記錄的csxh進行比較,如果相等即找到
返回0;
否則
返回1;
}查詢函數(shù)的使用示例...
/*獲取對帳場次*/
iRt=FetchMapGGXTCS((void*)"dzcc",&stGgxtcs,&CompareKeyFromGGXTCSWhereCSXHProc);
if(iRt!=0)
printf("獲取對帳場次失敗");
else
printf("當前對帳場次為[%s]",stGgxtcs.csz);
...使用該設計通過創(chuàng)建與數(shù)據(jù)庫表映射的共享內(nèi)存數(shù)據(jù)提高對數(shù)據(jù)庫靜態(tài)表(運行時數(shù)據(jù)內(nèi)容不改變或者只做少量更新的表)的查詢訪問速度,而不需要額外占用數(shù)據(jù)庫寶貴的效率,尤其在一個對數(shù)據(jù)庫操作頻繁的系統(tǒng)中能很大程度的提高整個系統(tǒng)的運行效率。本設計也有不足之處,主要是只能代替數(shù)據(jù)庫簡單的SELECT操作和UPDATE操作,不支持INSERT、DELETE操作,不過對于一些靜態(tài)表的查詢使用已經(jīng)足夠了,不是嗎^___^--------------------------------------------------------------------------------附件一、內(nèi)存映射表代碼模塊(以“公共系統(tǒng)參數(shù)表”為例)/********************************************
**獲取公共系統(tǒng)參數(shù)表內(nèi)存映射表相應記錄**
********************************************/#defineREPLACE_STRUCT_TYPEggxtcs
#defineREPLACE_STRUCT_ARGstGgxtcs
#defineREPLACE_SHEKEYSHMY_KEY_GGXTCS
#defineREPLACE_TABLENAMEggxtcs
#defineREPLACE_TABLEDESC"公共系統(tǒng)參數(shù)表"
#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;/*判斷內(nèi)存映射表是否存在*/
iReturnValue=IPCIsShareMemoryExist(REPLACE_SHEKEY);if(iReturnValue==IPC_SHAREMEMORY_RETURN_ISNT_EXIST)
{
/*若不存在則創(chuàng)建之*/
iReturnValue=LoadMapGGXTCS();if(iReturnValue!=0)
{
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_FETCH"|"LOG_LINELEN"|創(chuàng)建內(nèi)存映射表"REPLACE_TABLEDESC"失敗錯誤碼[%d]errno[%d],請重啟應用\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
iReturnValue,
errno);return-1;
}
}/*打開內(nèi)存映射表*/
ipcid=IPCOpenShareMemory(REPLACE_SHEKEY);if(ipcid<0)
{
/*打開失敗,寫出錯日志,函數(shù)返回*/
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_FETCH"|"LOG_LINELEN"|打開內(nèi)存映射表"REPLACE_TABLEDESC"失敗errno[%d],請重啟應用\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
errno);return-2;
}/*連接內(nèi)存映射表地址*/
pmp=IPCAttachShareMemory(ipcid);if(pmp==NULL)
{
/*連接失敗,寫出錯日志,函數(shù)返回*/
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_FETCH"|"LOG_LINELEN"|連接內(nèi)存映射表"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);/*搜尋內(nèi)存映射表*/
for(l=0;l<lRecordAmount;l++)
{
/*調(diào)用搜尋回調(diào)函數(shù)*/
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++;
}/*斷開內(nèi)存映射表地址連接*/
IPCDetachShareMemory(pmp);returniReturnValue;
}/***********************************
**更新公共系統(tǒng)參數(shù)表內(nèi)存映射表**
***********************************/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;/*判斷內(nèi)存映射表是否存在*/
iReturnValue=IPCIsShareMemoryExist(REPLACE_SHEKEY);if(iReturnValue==IPC_SHAREMEMORY_RETURN_ISNT_EXIST)
{
/*若不存在則創(chuàng)建之*/
iReturnValue=LoadMapGGXTCS();if(iReturnValue!=0)
{
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_FETCH"|"LOG_LINELEN"|創(chuàng)建內(nèi)存映射表"REPLACE_TABLEDESC"失敗錯誤碼[%d]errno[%d],請重啟應用\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
iReturnValue,
errno);return-1;
}
}/*打開內(nèi)存映射表*/
ipcid=IPCOpenShareMemory(REPLACE_SHEKEY);if(ipcid<0)
{
/*打開失敗,寫出錯日志,函數(shù)返回*/
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_FETCH"|"LOG_LINELEN"|打開內(nèi)存映射表"REPLACE_TABLEDESC"失敗errno[%d],請重啟應用\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
errno);return-2;
}/*連接內(nèi)存映射表地址*/
pmp=IPCAttachShareMemory(ipcid);if(pmp==NULL)
{
/*連接失敗,寫出錯日志,函數(shù)返回*/
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_FETCH"|"LOG_LINELEN"|連接內(nèi)存映射表"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);/*搜尋內(nèi)存映射表*/
for(l=0;l<lRecordAmount;l++)
{
/*調(diào)用搜尋回調(diào)函數(shù)*/
iReturnValue=REPLACE_FUNCNAME_UPDATE_PROC(pvCondValue,pvUpdateValue,pmpREPLACE_STRUCT_ARG);if(iReturnValue!=1)
{
break;
}pmpREPLACE_STRUCT_ARG++;
}/*斷開內(nèi)存映射表地址連接*/
IPCDetachShareMemory(pmp);returniReturnValue;
}/***********************************
**裝載公共系統(tǒng)參數(shù)表內(nèi)存映射表**
***********************************/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));/*獲取表記錄總條數(shù)*/
EXECSQL
SELECTcount(*)
INTO:dlRecordAmount
FROMREPLACE_TABLENAME;if(sqlca.sqlcode)
{
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_LOAD"|"LOG_LINELEN"|獲取"REPLACE_TABLEDESC"總記錄數(shù)失敗sqlcode[%d]\n",
GetLocalTimeString(gacTimeStringBuffer,256,"%Y-%m-%d%H:%M:%S"),
__LINE__,
sqlca.sqlcode);return-1;
}/*計算內(nèi)存映射表大小*/
/*前十個字節(jié)為儲存頭,存放儲存單元的個數(shù)*/
lMapSize=dlRecordAmount*sizeof(struct
REPLACE_STRUCT_TYPE)+10;/*創(chuàng)建內(nèi)存映射表*/
ipcid=IPCCreateShareMemory(REPLACE_SHEKEY,lMapSize);if(ipcid<0)
{
if(errno==EEXIST)
return0;WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_LOAD"|"LOG_LINELEN"|創(chuàng)建內(nèi)存映射表"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;
}/*連接內(nèi)存映射表地址*/
pmp=IPCAttachShareMemory(ipcid);if(pmp==NULL)
{
/*連接失敗,寫出錯日志,函數(shù)返回*/
WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_LOAD"|"LOG_LINELEN"|連接內(nèi)存映射表"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;/*如果記錄已取完,跳出循環(huán)*/
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);/*斷開內(nèi)存映射表地址連接*/
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++;
}/*斷開內(nèi)存映射表地址連接*/
IPCDetachShareMemory(pmp);/*關閉游標*/
EXECSQLCLOSEREPLACE_CURSORNAME;WriteLog(gacLogFilename,
"%s|"REPLACE_FUNCNAME_LOAD"|"LOG_LINELEN"|%ld條記錄進入內(nèi)存映射表"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附件二、下面這些函數(shù)被上面的程序調(diào)用過,代碼存放在本人設計的iIPC、iLibX基礎函數(shù)庫中。/*
**函數(shù)名:IPCIsShareMemoryExist
**函數(shù)描述:判斷共享存儲塊存在
**輸入?yún)?shù)說明:_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;
}/*
**函數(shù)名:IPCOpenShareMemory
**函數(shù)描述:打開共享存儲塊
**輸入?yún)?shù)說明:_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;
}/*
**函數(shù)名:IPCAttachShareMemory
**函數(shù)描述:連接共享存儲塊首地址
**輸入?yún)?shù)說明:_IPC_ID_Tipcid共享存儲塊的id
**返回值:存在返回首地址
**不存在返回NULL
*/void*IPCAttachShareMemory(_IPC_ID_Tipcid)
{
void*pvAttach;pvAttach=shmat(ipcid,NULL,0);if(pvAttach==(void*)-1)
returnNULL;
else
returnpvAttach;
}/*
**函數(shù)名:IPCDetachShareMemory
**函數(shù)描述:斷開共享存儲塊首地址
**輸入?yún)?shù)說明: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;
}/*
**函數(shù)名:WriteLog
**函數(shù)描述:正常寫日志函數(shù)
**輸入?yún)?shù)說明:char*pcLogFileName日志文件名
**char*pcFormatString日志格式串
**...日志參數(shù)列表
**返回值:成功,返回TRUE
**失敗,返回FALSE
**更新日志:2003/10/18創(chuàng)建
*/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;
}/*
**函數(shù)名:DoLog
**函數(shù)描述:日志記錄原始函數(shù)
**輸入?yún)?shù)說明:char*pcLogFileName日志文件名
**intiWriteFlag日志寫標志
**intiModeFlag日志寫完后操作標志
**char*pcFormatString日志格式串
**va_listvalist日志參數(shù)列表
**返回值:成功,返回TRUE
**失敗,返回FALSE
**更新日志:2003/10/18創(chuàng)建
*/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;
}/*
**函數(shù)名:GetLocalTimeString
**函數(shù)描述:格式化時間字符串(本地時間)
**輸入?yún)?shù)說明:size_tbufsize用于存放格式化后字符串的緩沖區(qū)大小
**constchar*format格式化串
**輸出參數(shù)說明char*buf用于存放格式化后字符串的緩沖區(qū)首地址(建議預分配256字節(jié))
**返回值:成功,返回TRUE
**失敗,返回FALSE
**更新日志:2003/10/18創(chuàng)建
**2004/3/3修改格式化后字符串的緩沖區(qū)首地址原型
*/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;
}/*
**函數(shù)名:GetLocalTimeStruct
**函數(shù)描述:把UNIX紀元到現(xiàn)在的秒數(shù)以structtm結構的形式返回(本地時間)
**返回值:秒數(shù)
**更新日志:2003/10/18創(chuàng)建
*/structtm*GetLocalTimeStruct()
{
time_ttime_cl;time(&time_cl);returnlocaltime(&time_cl);
}彎起鋼筋bent-upsteelbar混凝土結構構件的下部(或上部)縱向受拉鋼筋,按規(guī)定的部位和角度彎至構件上部(或下部)后,并滿足錨固要求的鋼筋。梁中彎起鋼筋構造要求:根據(jù)《混凝土結構設計規(guī)范》,在采用綁扎骨架的鋼筋混凝土梁中,當設置彎起鋼筋時,彎起鋼筋的彎終點外應留有錨固長度,其長度在受拉區(qū)不應小于20d,在受壓區(qū)不應小于10d;對光面鋼筋在末端應設置彎鉤。位于梁底層兩側(cè)的鋼筋不應彎起。彎起鋼筋的作用:彎起鋼筋在跨中附近和縱向受拉鋼筋一樣可以承擔正彎矩;在支座附近彎起后,其彎起段可以承受彎矩和剪力共同產(chǎn)生的主拉應力;彎起后的水平段有時還可以承受支座處的負彎矩。架立鋼筋erectionbar為滿足構造上或施工上的要求而設置的定位鋼筋。作用是把主要的受力鋼筋(如主鋼筋,箍筋等)固定在正確的位置上,并與主鋼筋連成鋼筋骨架,從而充分發(fā)揮各自的受力特性。架立鋼筋的直徑一般在10~14毫米之間。架立鋼筋在梁中的最小直徑梁的跨度(m)架立鋼筋直徑(mm)L<4≥84≤L≤6≥10L>6≥12受力鋼筋鋼筋混凝土結構中,按結構計算,承受拉力或壓力的鋼筋,是所配置鋼筋中的主要部分。負彎矩1、什么是負彎矩:在彎矩圖上,向上彎起的彎矩是正彎矩,反之,向下彎起的彎矩就是負彎矩;打個比方,你用手拗一只筷子,向下拗的時候,是筷子下部先斷;這是正彎矩,向上拗的時候,是是筷子上部先斷,這是負彎矩;明白了正負彎的區(qū)別,你就可以往下看了;2、為抵抗負彎矩而設置的鋼筋就叫負彎矩筋,在工地上常常簡稱為“負筋”,一般來說,常碰到的負彎矩筋有兩種,一種是樓板與
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年項目參與保密協(xié)議
- 2024無縫鋼管行業(yè)專利申請與保護協(xié)議2篇
- 2024招投標與合同管理:知識產(chǎn)權合同保護第一課3篇
- 2024年某高速路段建設引薦服務協(xié)議
- 2024年股權變更正規(guī)協(xié)議模板版B版
- 2024年設備租賃押金借款合同
- 2025餐飲業(yè)食品安全管理體系認證合同范本3篇
- 專業(yè)市場2024年度經(jīng)營管理承包合同書版B版
- 2024技術開發(fā)合作合同技術指標
- 2024食品公司信息安全保密合同
- 人教版五年級上冊四則混合運算300道及答案
- 服裝企業(yè)員工手冊模板范文
- 《低空航空器起降點基礎設施配置技術要求》(征求意見稿)
- 2024中輕度游戲全球市場趨勢洞察
- 中國兒童注意缺陷多動障礙ADHD防治指南專家講座
- 部編人教版數(shù)學二年級下冊課前預習單
- 解除勞動合同經(jīng)濟補償協(xié)議書
- 2024年4月自考02799獸醫(yī)臨床醫(yī)學試題
- 市政工程勞動力計劃
- 印度尼西亞發(fā)展熱帶經(jīng)濟作物的氣候條件評價-以爪哇和蘇門答臘島為例
- 吞咽障礙康復護理專家共識
評論
0/150
提交評論