| UNIX共享内存的程序 |
| 作者:linuxsea 来源:linux海洋 发布时间:2006-10-21 19:49:36 发布人:admin |
|
* 函数名: 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); } |
| [] [返回上一页] [打 印] [收 藏] |
上一篇文章:攻防:UNIX下缓冲区溢出深度防御体系 |
| ∷相关文章评论∷ (评论内容只代表网友观点,与本站立场无关!) [更多评论…] |
| · 入门提高 |
| · 开发区 |
| · 网络与应用 |
| · unix |
| · 新闻与认证 |