UNIX 平台 C 程序开发心得

1. limit
1 . 1 基本知识 查看 UNIX 操作系统资源限制 [HP-BILLFEE]limit cputime unlimited filesize unlimited datasize 1048576 kbytes stacksize 8192 kbytes coredumpsize 2097151 kbytes descriptors 2048 files memoryuse unlimited cputime: filesize: datasize: stacksize: coredumpsize: descriptors: memoryuse:
1 . 2 跟 l i mit 相关的注意事项 a. 通过 limit 限定的是某个用户对资源占用的软限制;在内核中,有关于上述参 数的硬限制,是针对所有用户而言的 。软限制无法超过硬限制 。b. 针对文件处理程序,打开文件句柄后,如果在异常处理环节忘记将文件句柄 关闭,那么程序占用的文件句柄数就会越来越多 。当超过 descriptors 数量之 后,就会出现无法打开文件的错误 。c. descriptors 不光是指文件句柄,还包括: socket 句柄等 。当 socket 连接建立后,如果没有正常的将 socket 连接关闭 。那么程序占用的 descriptors 数量也会超 过系统的软限制,从而出现 socket 连接失败、 文件打开失败等情况 。d. 存储器组织有三种形式: 静态分配、 栈分配、 堆分配 。静态存储分配: 如果在编译时能确定目标程序运行的全部数据空间的大 小,编译时安排好目标程序运行时的全部数据空间,确定每个数据对象的存 储位置,那么则称这种分配策略为静态存储分配 。栈式存储分配: 子程序数据区为过程的活动记录 (Activation recorder) 简记 AR,当一过程或函数被调用,活动记录 AR 被压入运行栈 。当过程或子程序 返回时,其活动记录被弹出运行栈,也就是释放空间 。堆式存储分配: 用户可以自由的申请和释放空间 。数据对象的空间的分配与释放,可在任何时间按任何顺序进行 。例如: C 和 C++ 的 alloc() 、 malloc()。e. 对于占用内存量很大的程序,需要注意程序 malloc 的累积内存量应当低于 datasize。否则 malloc 函数会调度失败,程序一般会提示: 内存不足 。f. stacksize 太小可能导致部分在其他机器上能够正常运行的程序无法运行,出 现 coredump。因为程序编译完成后,占用的 stack 大小是固定的,如果低于 stacksize,则程序无法装入内存 。例如: 在 Session. h 中定义了 CSession 类的一个成员: filename[MAX_FILE_NUM] [512] ; 该成员大概占用了 50K 的 stack size。50K 的 stacksize 导致程序在运行的时候,无法将数据压栈,从而出现总线 错误 。如果将 filename 修正成为 static 类型的,如下: { … static char filename[MAX_FILE_NUM] [512] ; … } ; char CSession: : filename[MAX_FILE_NUM] [512] ; 那么 filename 就不需要反复压栈,从而程序就可以正常运行 。
1 . 3相关技巧 1 . 3.1 检查没有关闭的句柄 查看程序没有释放的句柄的方法,可以通过: for (i=0;i<FOPEN_MAX;i++) // FOPEN_MAX 是程序可以打开的最大句柄 { if (close(i) ==EBADF) // 或其他的不影响程序功能的函数 printf("bad file handle:%dn", i) ; } 如果是 FILE * 类型,可以通过 fileno 转换得到 file handle。在适当的时候,用上述的方法检查那些没有关闭 。


【UNIX 平台 C 程序开发心得】


    推荐阅读