歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> UNIX共享內存的程序

UNIX共享內存的程序

日期:2017/2/28 11:29:02   编辑:關於Unix


/******************************************************************************
* 函數名: MallocPublicMemory
* 作者: linge_king
* 編寫日期:2002.04
* 函數功能:為結構分配共享內存
* 輸入: StructName:結構對象變量,Num:記錄個數,Point:結構指針,Size:結構尺寸
* 輸出: 無
*返回值: 返回分配內存的首地址
*
* 修改記錄(如果有)
* 注意事項:
*******************************************************************************/
void *MallocPublicMemory(void *Point,long Num,long Size,char *StruName)
{
char lc_Tmp[LONG_STRING_SIZE];
int li_SemId;/**/
int li_ShmId;/**/
long ll_Size;/**/
long *lp_Temp;/**/
if((li_SemId=semget(Tables.Property[Param.PresentRecord].MemKey,1,IPC_CREAT|IPC_EXCL|0664))<1)
{
sprintf(lc_Tmp,"數據已初始化過 (%s表)",Tables.Property[Param.PresentRecord].TableName);
perror(lc_Tmp);
Param.ExistFlag = 1;/*當前共享內存的初始化標志*/
return;
}
if(semctl(li_SemId,0,SETVAL,0)) /* set sem,lock it */
{
perror("初始化信號燈失敗");
exit(5);
}
printf("信號燈ID=%.7d, ",li_SemId);
ll_Size =sizeof(long) + Num * Size;
printf("共享內存大小%.10d (%s表)\n",ll_Size,StruName);
/* 創建共享內存 */
if((li_ShmId = shmget(Tables.Property[Param.PresentRecord].MemKey+1,ll_Size,IPC_CREAT|IPC_EXCL|0664))<1)
{
sprintf(lc_Tmp,"用戶%s共享內存創建失敗",StruName);
perror(lc_Tmp);
exit(5);
}
/* 取共享內存地址 */
if((lp_Temp = (long *)shmat(li_ShmId,NULL,0)) == (void*)-1)/* get addr */
{
sprintf(lc_Tmp,"打開%s共享內存失敗",StruName);
perror(lc_Tmp);
exit(5);
}
*lp_Temp = Num;
if(Num > 0)
{
Point = (void *)(lp_Temp + sizeof(long));
}
else
{
Point = NULL;
}
Param.SemId = li_SemId;
return(Point);
}
Copyright © Linux教程網 All Rights Reserved