kazmax - Linux で自宅サーバー

sysctl - システムコールの説明 - Linux コマンド集 一覧表

  1. 名前
  2. 書式
  3. 説明
  4. 返り値
  5. エラー
  6. 準拠
  7. 歴史
  8. バグ
  9. 関連項目

名前

sysctl - システム・パラメーターを読み書きする

書式

#include <unistd.h>
#include <linux/unistd.h>
#include <linux/sysctl.h>
#include <errno.h>
_syscall1(int, _sysctl, struct __sysctl_args *, args)
          /* Using syscall(2) may be preferable; see intro(2) */

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)を検索する。 そして、要求された項目が見つかった場合は適切なルーチンを呼び出して 値を読んだり修正したりする。

#include <linux/unistd.h>
#include <linux/types.h>
#include <linux/sysctl.h>


_syscall1(int, _sysctl, struct __sysctl_args *, args);
int sysctl(int *name, int nlen, void *oldval, size_t *oldlenp,
           void *newval, size_t newlen)
{
        struct __sysctl_args args={name,nlen,oldval,oldlenp,newval,newlen};
        return _sysctl(&args);
}

#define SIZE(x) sizeof(x)/sizeof(x[0])
#define OSNAMESZ 100

char osname[OSNAMESZ];
int osnamelth;
int name[] = { CTL_KERN, KERN_OSTYPE };

main(){
        osnamelth = sizeof(osname);
        if (sysctl(name, SIZE(name), osname, &osnamelth, 0, 0))
                perror("sysctl");
        else
                printf("This machine is running %*s\n", osnamelth, osname);
        return 0;
}

返り値

成功した場合は _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) 関数の宣言は両方で同じである。

バグ

オブジェクトの名前は、カーネルのバージョンごとに非常に異なっている。 「このため、このシステム・コールはアプリケーションにとって無価値な ものとなっている」 かわりに /proc/sys インターフェースを使用すること。
全ての可能な項目が正確に記述されているわけではない。
今のところ /proc/sys/kernel/ostype に書き込むことでオペーレーティング・システムを変えることはできない。

関連項目

  proc (5)