Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
Docbook 원문 syscall(2)

1장. syscall(2)

차례
1.1. 사용법
1.2. 설명
1.3. 반환값
1.4. 예제
1.5. 참고문헌

indirect 시스템 호출


1.1. 사용법

#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.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);
}
		
위 프로그램은 파일의 내용을 읽어서 출력하는 일을한다. open(), read(), write(), close()와 같은 주요 시스템 호출을 syscall()을 통해서 구현했다.

  • 굳이 system()함수를 사용할 필요가 있냐라는 생각이 듭니다. 혹시 성능상의 잇점같은 것을 얻을 수 있는지 궁금하군요.