Manpages

이 름

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 [AT] soback.net>, 2000년 7월 8일