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 特定的,不应在旨在可移植的程序中使用。sysctl() 调用自 Linux 1.3.57 版本以来一直存在。

它起源于 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

广告


  

广告



广告