Linux下sysctl函数的使用

来源:互联网 发布:软件测试 北大青鸟 编辑:程序博客网 时间:2024/05/20 20:01
    昨天下午测试在Unix域套接口上使用数据报发描述字,发现如果接收端不收取的话,发送端最多发11个就阻塞住了,而且阻塞与否和数据报字节数大小也没有关系。查了半天内核代码,确定是一个叫做unx.sysctl_max_dgram_qlen的变量在作怪,默认值是10,却没看出有什么修改的接口。
    晚上到家以后百无聊赖地翻UNP,本想随便看看非阻塞IO一章,却无意翻到有一节的题目叫“sysctl操作”,顿时觉得似曾相识。这一节在第18章《路由套接口》,一般来说这一章很容易被忽略,想不到居然隐藏了这么重要的功能。
    里面提到sysctl函数可以读写很多系统参量,诸如文件系统、虚拟内存、网络等信息,例如函数的参数设成{CTL_NET, AF_INET, IPPROTO_UDP, UDPCTL_CHECKSUM}就可以读写UDP校验和有关的设置。没有看到与Unix域有关的设置,便打算今天到公司再查。
    不料把UNP里的程序录入以后却无法编译,提示找不到几个头文件,UDPCTL_CHECKSUM之类的常量无从解析。内核中的unx.sysctl_max_dgram_qlen倒确实找到变量与之对应,使用系统命令sysctl -a就能看到输出项里有net.unix.max_dgram_qlen=10。用sysctl -w net.unix.max_dgram_qlen=20可以调大,经验证有效。但无法用函数实现终归不爽。

    中午有同事提醒说Linux下与sysctl有关的常量定义都在sys/sysctl.h下,而不是像UNP中那样一层一个头文件。检查sysctl.h,很容易找出了net.unix.max_dgram_qlen对应的名字序列:{CTL_NET, NET_UNIX, NET_UNIX_MAX_DGRAM_QLEN}。格式上确实比书中的(应该是BSD的格式)要规整一些。至于书中那个例子,AF_INET应该用NET_IPV4代替,但UDP对应的变量很少,似乎在Linux下是不开放接口的。




转自:http://blog.sina.com.cn/s/blog_4737b42c0100lek5.html

原创粉丝点击