SYSCTL

Section: Linux Programmer's Manual (2)
Updated: 2007-09-22
Index JM Home Page roff page
 

名前

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 の下のディレクトリ・ツリーに似た木構造(tree structure)を検索する。 そして、要求された項目が見つかった場合は適切なルーチンを呼び出して 値を読んだり修正したりする。  

返り値

成功した場合は _sysctl() は 0 を返す。失敗した場合、-1 が返され、 errno がそのエラーを示す値に設定される。  

エラー

EFAULT
oldval に NULL でない値を設定して、以前の値を要求しているのに、 oldlenp に空きがない。
ENOTDIR
name が見つからなかった。
EPERM

 'ディレクトリ'のどれかに検索許可がなかったか、 oldval が 0 でないのに読み込み許可がなかったか、 newval が 0 でないのに書き込み許可がなかった。
 

準拠

このコールは Linux 特有であり、移植を意図したプログラムで使用しては いけない。  

歴史

sysctl() コールは Linux のバージョン 1.3.57 から存在している。 これは 4.4BSD に由来している。Linux は /proc/sys に写し(mirror)をもっており、項目の名前の付け方が Linux と 4.4BSD では 異っている。しかし sysctl(2) 関数の宣言は両方で同じである。  

注意

glibc はこのシステムコールに対するラッパー関数を提供していない。 syscall(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);
}
 

関連項目

proc(5)


 

Index

名前
書式
説明
返り値
エラー
準拠
歴史
注意
バグ
関連項目

This document was created by man2html, using the manual pages.
Time: 04:32:07 GMT, November 19, 2007