sysctl

Autres langues

Langue: ko

Version: 1996년 5월 11일 (fedora - 25/11/07)

Autres sections - même nom

Section: 2 (Appels système)

이름

sysctl - 시스템 파라미터들을 읽고 쓴다.

사용법

#include <unistd.h>

#include <linux/unistd.h>

#include <linux/sysctl.h>

_syscall1(int, _sysctl, struct __sysctl_args *, args);

int _sysctl(struct __sysctl_args *args);

설명

_sysctl 시스템 콜은 커널 파리미터들을 읽고 쓴다. 예를 들어, 호스트 이름이나 열린 파일들의 최대 수 등이다. 인자는 다음과 같은 형태이다:
 struct __sysctl_args {
         int *name;        /* 변수를 가리키는 integer vector */
         int nlen;         /* 이 벡터의 길이*/
         void *oldval;     /* 0 또는 예전 값을 저장하기 위한 주소*/
         size_t *oldlenp;  /* 예전 값을 위해 이용할수 있는 공간,
                                           예전 값의 실제 크기에 의해 위에 쓰여진다.*/
         void *newval;     /* 0 또는 새로운 값의 주소*/
         size_t newlen;    /* 새로운 값의 크기*/
 };
 

이 함수는 트리 구조에서 탐색을 하며 /proc/sys아래의 디렉토리 트리와 비슷하다. 그리고 만일 요구된 아이템이 발견된다면 몇몇 적당한 루틴들이 이 값을 읽거나 번경하기 위해서 호출된다.

예제

 #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 = SIZE(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 는 에러를 가리키며 설정된다.

에러

ENOTDIR
name 이 발견되지 않았다.
EPERM
만난 `directories'중 하나에 대한 탐색 허가권이 없거나, oldval 가 0이 아닌곳의 읽기 허가권이 없거나, newval 이 0이 아닌곳의 쓰기 허가권이 없다.
EFAULT
호출은 non-NULL인 oldval 를 설정하여 전 값을 요구했지만, oldlenp에 있는 곳은 0 을 허가한다.

호환

이 함수는 리눅스에 의존하며 호환성을 염두에 둔 프로그램에서 사용해서는 안된다.

sysctl 시스템 콜은 Linux 버전 1.3.57이후부터 존재한다. 이것은 4.4BSD에 기반을 두고 있다. 단지 리눅스만이 /proc/sys 를 반영하고 있으며 객체 이름 구조들은 Linux와 BSD 4.4에서 서로 다르다. 그러나, sysctl(2)함수의 선언은 양쪽 모두 같다.

버그

객체 이름들은 커널 버전에 따라 다른다. 이 시스템 콜은 응용프로그램에서는 쓸모가 없다. 대신에 /proc/sys 를 사용해라.
이용할수 있는 모든 객체들이 문서화 되어 있지는 않다.
아직은 /proc/sys/kernel/ostype에 쓰기를 하여 OS를 변경하는것은 가능하지 않다.

관련 항목

proc(5)

역자

정강훈 <skyeyes@soback.kornet.net>, 2000년 7월 8일