Provided by: manpages-ja-dev_0.5.0.0.20180315+dfsg-1_all bug

名前

       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/ に書かれている。