이 름
intro − 시 스 템 콜 에 대 한 소 개
설 명
여 기 서 는 리 눅 스 시 스 템 콜 을 설 명 한 다 . 리 눅 스 2.0에 있 는 164개 의 시 스 템 콜 의 목 록 은 syscalls(2)를 보 아 라 .
직
접 호 출 하 기
대 부 분 의 경 우 ,
시 스 템 콜 을 직
접 호 출 할 필 요
는 없 지 만 , 당 신
에 게 필 요 한 함
수 가 표 준 C 라 이
브 러 리 에 구 현
되 지 않 는 경 우
도 있 다 .
사
용 법
#include <linux/unistd.h>
_syscall 매 크 로
원 하 는 시 스 템 콜
설
정
시 스 템 콜 에 대
해 알 아 야 하 는
중 요 한 사 항 은
프 로 토 타 입 이
다 . 인 자 의 개 수 ,
인 자 의 타 입 과
함 수 리 턴 타 입
을 알 필 요 가 있
다 . 시 스 템 으 로
의 실 제 적 인 호
출 을 더 쉽 게 해
주 는 6개 의 매 크
로 가 있 다 . 다 음
과 같 은 형 식 이
다 :
_syscallX(type,name,type1,arg1,type2,arg2,...)
X는 0–5, 시 스 템 콜 이 취 하 는 인 자 의 개 수 이 다 . system call | |
type는 시 스 템 콜 의 리 턴 타 입 | |
name는 시 스 템 콜 의 이 름 | |
typeN는 N번 째 인 자 의 타 입 | |
argN는 N번 째 인 자 의 이 름 |
이 매 크 로 는 명 시 한 인 자 를 갖 는 name 이 름 의 함 수 를 만 든 다 . 소 스 파 일 에 _syscall()을 포 함 시 키 면 , name으 로 시 스 템 콜 을 호 출 할 수 있 다 .
예 제
#include <stdio.h>
#include <linux/unistd.h> |
/* _syscallX 매 크 로 /관 련 된 것 */ | |||
#include <linux/kernel.h> |
/* struct sysinfo */ |
_syscall1(int, sysinfo, struct sysinfo *, info);
/* 주
의 : nroff 소 스 에 서
바 로 복 사 를 한
다 면 , printf 문 에 서
여 분 의 백 슬 레
쉬 (\)를 지 워 야 한
다 . */
int main(void)
{
struct sysinfo s_info; | |
int error; | |
error = sysinfo(&s_info); | |
printf("code error = %d\n", error); |
printf("Uptime =
%ds\nLoad: 1 min %d / 5 min %d / 15 min %d\n"
"RAM: total %d / free %d / shared %d\n"
"Memory in buffers = %d\nSwap: total %d / free
%d\n"
"Number of processes = %d\n",
s_info.uptime, s_info.loads[0], | |||
s_info.loads[1], s_info.loads[2], | |||
s_info.totalram, s_info.freeram, | |||
s_info.sharedram, s_info.bufferram, | |||
s_info.totalswap, s_info.freeswap, | |||
s_info.procs); | |||
return(0); |
}
예 제 출 력
code error = 0
uptime = 502034s
Load: 1 min 13376 / 5 min 5504 / 15 min 1152
RAM: total 15343616 / free 827392 / shared 8237056
Memory in buffers = 5066752
Swap: total 27881472 / free 24698880
Number of processes = 40
주 의
_syscall() 매 크 로 는 프 로 토 타 입 을 만 들 지 는 않 는 다 . 특 히 C++ 사 용 자 라 면 , 프 로 토 타 입 은 생 성 해 야 만 할 것 이 다 .
시 스 템 콜 은 양 수 나 음 수 에 러 코 드 만 을 리 턴 해 야 만 하 지 는 않 는 다 . 어 떻 게 에 러 를 리 턴 하 는 지 를 알 려 면 소 스 를 읽 을 필 요 가 있 다 . 보 통 음 수 는 표 준 에 러 코 드 이 다 . 즉 , −EPERM. _syscall() 매 크 로 는 r이 음 수 가 아 닐 때 r를 리 턴 하 지 만 , r이 음 수 일 때 −r를 errno에 설 정 하 고 −1을 리 턴 한 다 . 에 러 코 드 에 대 해 서 는 errno(3)을 보 아 라 .
mmap과 같 은 몇 몇 의 시 스 템 콜 은 5개 이 상 의 인 자 를 갖 는 다 . 이 는 인 자 를 스 택 에 넣 고 인 자 블 럭 을 포 인 터 를 넘 기 는 방 법 으 로 처 리 된 다 .
시 스 템 콜 을 정 의 할 때 , 인 자 는 반 드 시 값 이 나 포 인 터 (구 조 체 같 은 집 합 형 의 경 우 )로 넘 겨 져 야 만 한 다 .
호 환
시 스 템 콜 이 어 떤 유 닉 스 변 형 이 나 표 준 과 호 환 이 되 는 지 나 타 내 는 코 드 는 다 음 과 같 다 :
SVr4 |
시 스 템 V 릴 리 즈 4 유 닉 스 (System V Release 4 Unix), "Programmer’s Reference Manual: Operating System API (Intel processors)" (Prentice-Hall 1992, ISBN 0-13-951294-2)에 설 명 되 있 다 . | ||
SVID |
시 스 템 V 인 터 페 이 스 정 의 (System V Interface Definition), "The System V Interface Definition, Fourth Edition"에 설 명 되 있 고 , 이 는 ftp://ftp.fpk.novell.com/pub/unix-standards/svid에; 포 스 트 스 크 립 트 파 일 로 있 다 . |
POSIX.1
IEEE 1003.1-1990 part 1, 별 칭 ISO/IEC 9945-1:1990s, 별 칭 "IEEE Portable Operating System Interface for Computing Environments", Donald Lewine의 "POSIX Programmer’s Guide" (O’Reilly & Associates, Inc., 1991, ISBN 0-937175-73-0)에 설 명 되 있 다 .
POSIX.1b
IEEE Std 1003.1b-1993 (POSIX.1b standard)는 포 터 블 운 영 체 제 를 위 한 실 시 간 인 터 페 이 스 를 설 명 한 다 , 별 칭 ISO/IEC 9945-1:1996, Biil O. Gallmeister의 "Programming for the real world − POSIX.4" (O’Reilly & Associates, Inc. ISBN 1-56592-074-0)에 설 명 되 있 다 .
SUS, SUSv2
단 일 유 닉 스 명 세 (Single Unix Specification). (X/Open과 The Open Group에 서 만 들 었 다 . http://www.UNIX-systems.org/version2/를; 참 조 하 라 .)
4.3BSD/4.4BSD
버 클 리 유 닉 스 의 4.3과 4.3 배 포 본 . 4.4BSD는 4.3부 터 호 환 성 이 유 지 되 었 다 .
V7 |
버 전 7 (Version 7), 벨 연 구 소 의 원 조 유 닉 스 . |
파 일
/usr/include/linux/unistd.h
관 련 항 목
errno(3)
역 자
임 종 균 <hermes44 [AT] secsm.org>, 2000년 4월 19일