#include <linux/unistd.h>
#include <linux/sysctl.h>
_syscall1(int, _sysctl, struct __sysctl_args *, args);
int _sysctl(struct __sysctl_args *args);
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 시스템 콜은 Linux 버전 1.3.57이후부터 존재한다. 이것은 4.4BSD에 기반을 두고 있다. 단지 리눅스만이 /proc/sys 를 반영하고 있으며 객체 이름 구조들은 Linux와 BSD 4.4에서 서로 다르다. 그러나, sysctl(2)함수의 선언은 양쪽 모두 같다.