#include <sys/syscall.h>
#include <unistd.h>
int syscall(int number, ...);
1.2. 설명
syscall()은 시스템 호출의 어셈블리(:12) 인터페이스이다. 첫번째 인자는
시스템콜(:12) 번호이며, 그 다음으로 각 시스템콜의 인자가 입력된다.
시스템 콜 번호는 Linux 시스템콜 레퍼런스를 참고하기 바란다.
syscall()을 사용할때 시스템 콜 번호를 직접입력하는 것은 귀찮은
작업인데, 각 시스템 콜에 대해서 sys/syscall.h 에 정의되어 있으니
참고하기 바란다. SYS_systemcall식으로 정의되어
있다. 예를들어 open()시스템 호출을 사용하기 원한다면
syscall(SYS_open,...)식으로 사용하면 된다.
역사적으로 syscall()은 BSD4.0에 의해서 사용되어졌다.
1.3. 반환값
반환값은 시스템 콜의 리턴 정책에 따라서 달라진다. 일반적으로
성공했다면 0, 에러가 발생했다면 -1이 리턴된다. 에러 코드는
errno에 저장된다.
1장. syscall(2)
indirect 시스템 호출
1.1. 사용법
1.2. 설명
syscall()은 시스템 호출의 어셈블리(:12) 인터페이스이다. 첫번째 인자는 시스템콜(:12) 번호이며, 그 다음으로 각 시스템콜의 인자가 입력된다. 시스템 콜 번호는 Linux 시스템콜 레퍼런스를 참고하기 바란다. syscall()을 사용할때 시스템 콜 번호를 직접입력하는 것은 귀찮은 작업인데, 각 시스템 콜에 대해서 sys/syscall.h 에 정의되어 있으니 참고하기 바란다. SYS_systemcall식으로 정의되어 있다. 예를들어 open()시스템 호출을 사용하기 원한다면 syscall(SYS_open,...)식으로 사용하면 된다.
역사적으로 syscall()은 BSD4.0에 의해서 사용되어졌다.
1.3. 반환값
반환값은 시스템 콜의 리턴 정책에 따라서 달라진다. 일반적으로 성공했다면 0, 에러가 발생했다면 -1이 리턴된다. 에러 코드는 errno에 저장된다.
1.4. 예제
#include <syscall.h> #include <unistd.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #define BUF_SIZE 256 int main() { int fd; int n; char buf[BUF_SIZE]; // 시스템콜의 직접 사용 // 시스템콜 번호 : 20 fd = syscall(SYS_open, "syscall.c", O_RDONLY); if (fd < 0) { perror("Open Syscall Error "); exit(0); } while((n = syscall(SYS_read, fd, buf,BUF_SIZE - 1)) > 0) { syscall(SYS_write, 1, buf, n); memset(buf, 0x00, BUF_SIZE); } syscall(SYS_close); return (0); }1.5. 참고문헌
Linux 시스템콜 레퍼런스
Recent Posts
Archive Posts
Tags