sysctl - システムコールの説明 - Linux コマンド集 一覧表
名前
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
に書き込むことでオペーレーティング・システムを変えることはできない。