sysctl函数

本文介绍了sysctl、sysctlname和sysctlnametomib等函数,用于获取和设置系统信息。讲解了这些函数在FreeBSD中的使用,包括如何获取整数、字符串和表信息,并提供了示例代码展示如何使用sysctl函数获取进程信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于sysctl有关的函数,网上资料比较少,我整理了一些大家一起学习探讨。

1.sysctl有关函数

sysctl,sysctlname,sysctlnametomib,这三个函数的功能是获取或者设置系统信息的函数。

注:对于用sysctl命令和配置文件的方法网上讲解比较好找,大家自行解决。

2.库

标准c库函数

3.概要

#include <sys/types.h>

#include<sys/sysctl.h>

int sysctl(const int *name,u_int namelen,void *oldp,size_t *oldlenp,const void *newp,size_t newlen);

int sysctlbyname(const char *name, void *oldp, size_t *oldlenp,
         const void *newp, size_t newlen);

int
     sysctlnametomib(const char *name, int *mibp, size_t *sizep);

4.描述

sysctl函数检索系统信息和允许适当的进程设置系统信息。sysctl函数可以得到整数,字符串和表的信息(这句话比较不符合中国人口味啊,这是楼主酝酿了半天翻译出来的,感觉应该和sysctl -a 的信息类似吧)。信息可以被重新设置通过sysctl命令行借口。

sysctl函数根据数据的需要返回一致的快照。一致性包括被锁到目的buffer内存中以至于数据拷贝出来的时候不需要加锁,调用函数sysctl的时候避免死锁。

这个规定被描述用一个MIB的形式名字,列出name,这个name的长度就是参数namelen。

sysctlbyname函数接受ASCII代表名字和数字名字的形式。并且,它严格要求和标准sysctl函数一样。

信息被拷贝到buffer中通过参数oldp。buffer的长度是通过调用之前位置指定的,同时那个位置给出大量的数据拷贝在一次成功调用之后和调用之后返回错误码。如果那大量的可用数据大于那个buffer提供的大小,这次调用提供最大的合适数据同时返回错误码,如果旧的数据不是想要的,oldp和oldlenp被设置为NULL。

通过设置参数oldp为NULL调用函数sysctl可以绝对可用数据的大小。这些可用数据将会被返回被oldlenp指向的位置。对于一些操作,大量的空间会经常改变。对于这些操作,系统会指向周围以至于返回的大小足够大作为返回的数据。

为了设置一个新的值,newp,被设置指向一个buffernewlen的长度通过需要值被设置。如果一个新值不被设置,newp应该被设置为NULL和newlen设置为0.

sysctlnametomib()函数接受一个ASCII表示的名字,名字查找整数向量,并返回数值的翅界定mibp mib数组中指出。元素的数量mib数组是由sizep在指定的位置电话,这个位置给条目复制的数量等cessful电话。由此产生的可用于后续mib和大小sysctl()调用获取数据与请求相关联的ASCII的名字。这个接口的目的是想要重复使用的应用程序ed请求相同的变量(sysctl()函数运行在一第三时间相同的请求通过sysctlbyname()函数)。sysctlnametomib()函数也适用于抓取mib前缀然后添加最后一个组件。有限公司——例如,获取过程美信流程与pid的不到100

例子:

int i, mib[4];
           size_t len;
           struct kinfo_proc kp;

           /* Fill out the first three components of the mib */
           len = 4;
           sysctlnametomib("kern.proc.pid", mib, &len);

           /* Fetch and print entries for pid's < 100 */
           for (i = 0; i < 100; i++) {
                   mib[3] = i;
                   len = sizeof(kp);
                   if (sysctl(mib, 4, &kp, &len, NULL, 0) == -1)
                           perror("sysctl");
                   else if (len > 0)
                           printkproc(&kp);
           }

 

暂时讲这么多,剩下的debug之类的后续讲解。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值