名前


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) 関数の宣言は両方で同じである。

バグ


オブジェクトの名前は、カーネルのバージョンごとに非常に異なっている。 「このため、このシステム・コールはアプリケーションにとって無価値な ものとなっている」 かわりに /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) を使って呼び出すこと。

関連項目


proc(5)

openSUSE Logo

コンテンツ