Manpages

名 前

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.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。