- 论坛徽章:
- 0
|
本帖最后由 71v5 于 2014-11-18 00:30 编辑
版主,我搞错了哈,大概如下:
系统范围内的限制:- int maxfiles; /* sys. wide open files limit,打开文件数目的限制 */
复制代码 从下面的宏可以知道:- SYSCTL_PROC(_kern_ipc, OID_AUTO, maxsockets, CTLTYPE_INT|CTLFLAG_RW,&maxsockets, 0, sysctl_maxsockets, "IU", "Maximum number of sockets avaliable");
复制代码 maxsockets->"Maximum number of sockets avaliable",sysctl对该变量的修改最终都是通过函数sysctl_maxsockets来操作。
宏SYSCTL_PROC的简单原理就是构造一个struct sysctl_oid类型的对象来描述maxsockets,并将该对象的地址保存到特定的section中,在内核初始化的过程中,会遍历该
section,使用保存的struct sysctl_oid类型的对象构建一棵MIB TREE。
[函数sysctl_maxsockets简单描述如下]:- /*
- * 宏SYSCTL_HANDLER_ARGS展开如下:
- * struct sysctl_oid *oidp, void *arg1,intptr_t arg2, struct sysctl_req *req
- *
- * 在这里暂时只需要关心第一个和第四个参数:
- * oidp:内核中用来描述maxsockets的struct sysctl_oid对象。
- * req:用户态的sysctl命令是通过sysctl*系统调用调用实现的,struct sysctl_req
- * 类型的对象将传递进来的参数封装起来。
- */
- 287 static int
- 288 sysctl_maxsockets(SYSCTL_HANDLER_ARGS)
- 289 {
- 290 int error, newmaxsockets;
- 291 /*
- * 292:newmaxsockets保存了之前maxsockets的值。
- *
- * 293:函数sysctl_handle_int执行完后:
- * newmaxsockets:被修改为新设置的value。
- * maxsockets:没有被修改,保持原来的value。
- * 暂时不用关心294行if语句的条件,这里假设其为真。
- * 295-300之间的语句:
- * 新设置的maxsockets的值要大于之前maxsockets的值并且
- * 新设置的maxsockets的值要<= maxfiles。
- * 当上面的条件都满足时,此时才更新maxsockets。
- *
- * 还可以看出,当要更新maxsockets时,先要看看maxfiles的值,根据需要
- * 先调整maxfiles的值,然后再更新maxsockets。
- *
- * EINVAL:是一个error number,这是内核返回给调用者(一般是函数库中的函数),
- * 的错误码,由调用者将其转换为相应的错误描述字符串,比如错误码
- * EINVAL的错误描述就是“Invalid argument”。
- * 其实更准确的应该是,kernel中的函数将错误码返回给调用者(一般是函数库中的函数),
- * 调用者将这个error number保存到全局变量errno,一般情况下,将给应用程序返回
- * -1,应用程序检查返回值如果是-1,就标识出错,此时就回去检查errno。
- */
- 292 newmaxsockets = maxsockets;
- 293 error = sysctl_handle_int(oidp, &newmaxsockets, 0, req);
- 294 if (error == 0 && req->newptr) {
- 295 if (newmaxsockets > maxsockets &&
- 296 newmaxsockets <= maxfiles) {
- 297 maxsockets = newmaxsockets;
- 298 EVENTHANDLER_INVOKE(maxsockets_change);
- 299 } else
- 300 error = EINVAL;
- 301 }
- 302 return (error);
- 303 }
复制代码 |
评分
-
查看全部评分
|