EN JA
SYSCTL(2)
SYSCTL(2) Linux Programmer's Manual SYSCTL(2)

名前

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

書式


#include <unistd.h>
 

#include <linux/sysctl.h>
 

int _sysctl(struct __sysctl_args * args );
 
: このシステムコールには glibc のラッパー関数は存在しない。「注意」の節を参照。

説明

このシステムコールを使用しないこと! 「注意」の節を参照。
 
_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 が見つからなかった。
EACCESEPERM
「ディレクトリ」のどれかに検索許可がなかったか、 oldval が 0 でないのに読み込み許可がなかったか、 newval が 0 でないのに書き込み許可がなかった。

準拠

このコールは Linux 特有であり、移植を意図したプログラムで使用してはいけない。 sysctl() コールは Linux のバージョン 1.3.57 から存在している。これは 4.4BSD に由来している。Linux は /proc/sys に写し(mirror)をもっており、項目の名前の付け方が Linux と 4.4BSD では異っている。しかし sysctl() 関数の宣言は両方で同じである。

注意

glibc はこのシステムコールに対するラッパー関数を提供していない。 syscall(2) を使って呼び出すこと。というよりは・・・このシステムコールを呼び出さないこと。長い間このシステムコールの使用は非推奨とされており、「将来のバージョンのカーネルで削除されるようだ」と言われるほどである。あなたのプログラムにこのシステムコールがあれば、すぐにでも削除すること。代わりに /proc/sys インターフェースを使用すること。
 
このシステムコールは、カーネルの CONFIG_SYSCTL_SYSCALL オプションが有効になっている場合のみ利用できる。

バグ

オブジェクトの名前は、カーネルのバージョンごとに異なっている。このため、このシステム・コールはアプリケーションにとって無価値なものとなっている。

全ての可能な項目が正確に記述されているわけではない。

今のところ /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)

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。
2012-12-22 Linux