sysctl() - Unix、Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考资料     讨论论坛     关于 TP  

sysctl() - Unix、Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

sysctl - 读取/写入系统参数

概要

#include <unistd.h> 

#include <linux/sysctl.h>

int _sysctl(struct __sysctl_args *args);

描述

sysctl() 调用读取和/或写入内核参数。例如,主机名或最大打开文件数。参数具有以下形式

struct __sysctl_args {
    int    *name;    /* integer vector describing variable */
    int     nlen;    /* length of this vector */
    void   *oldval;  /* 0 or address where to store old value */
    size_t *oldlenp; /* available room for old value,
                        overwritten by actual size of old value */
    void   *newval;  /* 0 or address of new value */
    size_t  newlen;  /* size of new value */
};

此调用在一个树状结构中进行搜索,可能类似于/proc/sys下的目录树,如果找到请求的项目,则调用一些适当的例程来读取或修改值。

返回值

成功完成时,sysctl() 返回 0。否则,返回 -1,并设置errno以指示错误。

错误

标签描述
EFAULT 调用通过设置oldval为非 NULL 来请求先前的值,但允许在oldlenp中留有零空间。
ENOTDIR
  未找到name
EPERM 对遇到的某个“目录”没有搜索权限,或者在oldval非零时没有读取权限,或者在newval非零时没有写入权限。

符合标准

此调用是 Linux 特定的,不应在旨在可移植的程序中使用。自 1.3.57 版本以来,Linux 中就存在sysctl() 调用。它起源于 4.4BSD。只有 Linux 具有/proc/sys镜像,并且 Linux 和 4.4BSD 的对象命名方案有所不同,但是sysctl(2) 函数的声明在两者中是相同的。

缺陷

对象名称因内核版本而异。这使得此系统调用对于应用程序毫无用处。请改用/proc/sys接口。

并非所有可用的对象都已正确记录。

目前尚无法通过写入/proc/sys/kernel/ostype来更改操作系统。

示例

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <linux/sysctl.h>

int _sysctl(struct __sysctl_args *args );

#define OSNAMESZ 100

int main(void) { struct __sysctl_args args; char osname[OSNAMESZ]; size_t osnamelth; int name[] = { CTL_KERN, KERN_OSTYPE };

memset(&args, 0, sizeof(struct __sysctl_args)); args.name = name; args.nlen = sizeof(name)/sizeof(name[0]); args.oldval = osname; args.oldlenp = &osnamelth;

osnamelth = sizeof(osname); if (syscall(SYS__sysctl, &args) == -1) { perror("_sysctl"); exit(EXIT_FAILURE); } printf("This machine is running %*s\n", osnamelth, osname); exit(EXIT_SUCCESS); }

备注

Glibc 没有为此系统调用提供包装器;请使用syscall(2) 调用它。

参见



previous next Printer Friendly

广告


  

广告



广告