Distribution Complete blog

syscalls(2) - Linux manual page

Apr. 15, 2021

심심하니까 시리즈 번역물을 만들어 보기로 한다. 또하나의 장기 프로젝트 - 리눅스 매뉴얼 페이지, MAN

원문 링크

syscalls(2) - Linux manual page

번역

이름

syscalls - Linux system calls

시놉시스

Linux system calls

설명

시스템콜이라 함은 리눅스 커널과 애플리케이션 사이의 기반 인터페이스를 의미한다.

시스템콜과 라이브러리 래퍼(wrapper) 함수

애플리케이션에서 시스템콜을 직접 호출하는 경우는 많지않다. 대신 glibc(또는 다른 라이브러리)에 내장된 래퍼 함수를 통해 호출된다. 시스템콜을 직접 호출하는 방법에 대해 알고 싶다면, 다음을 참조하자. 항상은 아니지만 대부분의 경우, 라이브러리에 내장된 래퍼 함수의 이름은 호출하고자 하는 시스템콜의 이름과 동일하다. 예를들면 glibc는 chdir()이라는 함수를 제공하는데 이는 “chdir” 이라는 시스템콜과 이름이 같다.

일반적으로 glibc 내장 래퍼 함수는 매우 간략한 구조를 가진다. 시스템콜을 호출하기 전에 필요한 필요한 인자(arguments)를 올바른 레지스터에 복사하고, 시스템콜의 리턴을 바탕으로 errno(3)를 정확하게 설정하는 정도의 역할을 수행한다. (래퍼 함수가 없이 직접 시스템콜을 호출할때 syscall(2)은 이와 동일한 방법과 절차로 시스템콜을 호출한다. 노트 syscall(2)에 명시된 별도의 분리된 에러 레지스터/플래그가 없는 아키텍처에서는 실패한 시스템콜 호출의 결과로 음수(negative)의 에러 번호를 리턴한다. 아무튼 이런 시스템콜 호출 실패가 발생하면 래퍼 함수는 시스템콜로 부터 리턴된 에러 번호에 다시 (-)를 곱하고(양수로 만들기 위해), 이를 errno로 복사한 후 래퍼를 호출한 함수에 -1을 리턴한다.

래퍼 함수는 시스템콜을 호출하기전에 위에 설명한 기본 동작에 더하여 추가적인 작업을 수행하기도 한다. 예를 들면, (아래에 설명한 이유로 인해) 최근에는 truncate(2)truncate64(2) 처럼 하나의 시스템에 두개의 시스템콜이 동시에 존재하는 경우, glibc의 truncate() 래퍼 함수가 호출 되었을때 이 두개의 시스템콜중 어떤것이 시스템에서 유효한지 확인한후 올바른 시스템콜을 선택하는 작업이다.

시스템콜의 리스트

아래는 리눅스 시스템콜 리스트에 대해 기술했다. 리스트에서 Kernel 컬럼은 새롭게 소개된 시스템콜이 어떠한 커널 버전 부터 제공되었는지를 표시한다. 다음의 사항들을 참고:

커널 5.11에 제공되는 (오래된 커널 버전에는 더 적은) 시스템콜 리스트는 아래와 같다.

System callKernelNotes
_llseek(2)1.2
_newselect(2)2.0
_sysctl(2)2.0Removed in 5.5
accept(2)2.0See notes on socketcall(2)
accept4(2)2.6.28
access(2)1.0
acct(2)1.0
add_key(2)2.6.10
adjtimex(2)1.0
alarm(2)1.0
alloc_hugepages(2)2.5.36Removed in 2.5.44
arc_gettls(2)3.9ARC only
arc_settls(2)3.9ARC only
arc_usr_cmpxchg(2)4.9ARC only
arch_prctl(2)2.6x86_64, x86 since 4.12
atomic_barrier(2)2.6.34m68k only
atomic_cmpxchg_32(2)2.6.34m68k only
bdflush(2)1.2Deprecated (does nothing) since 2.6
bind(2)2.0See notes on socketcall(2)
bpf(2)3.18
brk(2)1.0
breakpoint(2)2.2ARM OABI only, defined with _ARM_NR prefix
cacheflush(2)1.2Not on x86
capget(2)2.2
capset(2)2.2
chdir(2)1.0
chmod(2)1.0
chown(2)2.2See chown(2) for version details
chown32(2)2.4
chroot(2)1.0
clock_adjtime(2)2.6.39
clock_getres(2)2.6
clock_gettime(2)2.6
clock_nanosleep(2)2.6
clock_settime(2)2.6
clone2(2)2.4IA-64 only
clone(2)1.0
clone3(2)5.3
close(2)1.0
close_range(2)5.9
connect(2)2.0See notes on socketcall(2)
copy_file_range(2)4.5
creat(2)1.0
create_module(2)1.0Removed in 2.6
delete_module(2)1.0
dup(2)1.0
dup2(2)1.0
dup3(2)2.6.27
epoll_create(2)2.6
epoll_create1(2)2.6.27
epoll_ctl(2)2.6
epoll_pwait(2)2.6.19
epoll_pwait2(2)5.11
epoll_wait(2)2.6
eventfd(2)2.6.22
eventfd2(2)2.6.27
execv(2)2.0SPARC/SPARC64 only, for compatibility with SunOS
execve(2)1.0
execveat(2)3.19
exit(2)1.0
exit_group(2)2.6
faccessat(2)2.6.16
faccessat2(2)5.8
fadvise64(2)2.6
fadvise64_64(2)2.6
fallocate(2)2.6.23
fanotify_init(2)2.6.37
fanotify_mark(2)2.6.37
fchdir(2)1.0
fchmod(2)1.0
fchmodat(2)2.6.16
fchown(2)1.0
fchown32(2)2.4
fchownat(2)2.6.16
fcntl(2)1.0
fcntl64(2)2.4
fdatasync(2)2.0
fgetxattr(2)2.6; 2.4.18
finit_module(2)3.8
flistxattr(2)2.6; 2.4.18
flock(2)2.0
fork(2)1.0
free_hugepages(2)2.5.36Removed in 2.5.44
fremovexattr(2)2.6; 2.4.18
fsconfig(2)5.2
fsetxattr(2)2.6; 2.4.18
fsmount(2)5.2
fsopen(2)5.2
fspick(2)5.2
fstat(2)1.0
fstat64(2)2.4
fstatat64(2)2.6.16
fstatfs(2)1.0
fstatfs64(2)2.6
fsync(2)1.0
ftruncate(2)1.0
ftruncate64(2)2.4
futex(2)2.6
futimesat(2)2.6.16
get_kernel_syms(2)1.0Removed in 2.6
get_mempolicy(2)2.6.6
get_robust_list(2)2.6.17
get_thread_area(2)2.6
get_tls(2)4.15ARM OABI only, has __ARM_NR prefix
getcpu(2)2.6.19
getcwd(2)2.2
getdents(2)2.0
getdents64(2)2.4
getdomainname(2)2.2SPARC, SPARC64; available as osf_getdomainname(2) on Alpha since Linux 2.0
getdtablesize(2)2.0SPARC (removed in 2.6.26), available on Alpha as osf_getdtablesize(2)
getegid(2)1.0
getegid32(2)2.4
geteuid(2)1.0
geteuid32(2)2.4
getgid(2)1.0
getgid32(2)2.4
getgroups(2)1.0
getgroups32(2)2.4
gethostname(2)2.0Alpha, was available on SPARC up to Linux 2.6.26
getitimer(2)1.0
getpeername(2)2.0See notes on socketcall(2)
getpagesize(2)2.0Not on x86
getpgid(2)1.0
getpgrp(2)1.0
getpid(2)1.0
getppid(2)1.0
getpriority(2)1.0
getrandom(2)3.17
getresgid(2)2.2
getresgid32(2)2.4
getresuid(2)2.2
getresuid32(2)2.4
getrlimit(2)1.0
getrusage(2)1.0
getsid(2)2.0
getsockname(2)2.0See notes on socketcall(2)
getsockopt(2)2.0See notes on socketcall(2)
gettid(2)2.4.11
gettimeofday(2)1.0
getuid(2)1.0
getuid32(2)2.4
getunwind(2)2.4.8IA-64 only; deprecated
getxattr(2)2.6; 2.4.18
getxgid(2)2.0Alpha only; see NOTES
getxpid(2)2.0Alpha only; see NOTES
getxuid(2)2.0Alpha only; see NOTES
init_module(2)1.0
inotify_add_watch(2)2.6.13
inotify_init(2)2.6.13
inotify_init1(2)2.6.27
inotify_rm_watch(2)2.6.13
io_cancel(2)2.6
io_destroy(2)2.6
io_getevents(2)2.6
io_pgetevents(2)4.18
io_setup(2)2.6
io_submit(2)2.6
io_uring_enter(2)5.1
io_uring_register(2)5.1
io_uring_setup(2)5.1
ioctl(2)1.0
ioperm(2)1.0
iopl(2)1.0
ioprio_get(2)2.6.13
ioprio_set(2)2.6.13
ipc(2)1.0
kcmp(2)3.5
kern_features(2)3.7SPARC64 only
kexec_file_load(2)3.17
kexec_load(2)2.6.13
keyctl(2)2.6.10
kill(2)1.0
lchown(2)1.0See chown(2) for version details
lchown32(2)2.4
lgetxattr(2)2.6; 2.4.18
link(2)1.0
linkat(2)2.6.16
listen(2)2.0See notes on socketcall(2)
listxattr(2)2.6; 2.4.18
llistxattr(2)2.6; 2.4.18
lookup_dcookie(2)2.6
lremovexattr(2)2.6; 2.4.18
lseek(2)1.0
lsetxattr(2)2.6; 2.4.18
lstat(2)1.0
lstat64(2)2.4
madvise(2)2.4
mbind(2)2.6.6
memory_ordering(2)2.2SPARC64 only
membarrier(2)3.17
memfd_create(2)3.17
migrate_pages(2)2.6.16
mincore(2)2.4
mkdir(2)1.0
mkdirat(2)2.6.16
mknod(2)1.0
mknodat(2)2.6.16
mlock(2)2.0
mlock2(2)4.4
mlockall(2)2.0
mmap(2)1.0
mmap2(2)2.4
modify_ldt(2)1.0
mount(2)1.0
move_mount(2)5.2
move_pages(2)2.6.18
mprotect(2)1.0
mq_getsetattr(2)2.6.6
mq_notify(2)2.6.6
mq_open(2)2.6.6
mq_timedreceive(2)2.6.6
mq_timedsend(2)2.6.6
mq_unlink(2)2.6.6
mremap(2)2.0
msgctl(2)2.0See notes on ipc(2)
msgget(2)2.0See notes on ipc(2)
msgrcv(2)2.0See notes on ipc(2)
msgsnd(2)2.0See notes on ipc(2)
msync(2)2.0
munlock(2)2.0
munlockall(2)2.0
munmap(2)1.0
name_to_handle_at(2)2.6.39
nanosleep(2)2.0
newfstatat(2)2.6.16See stat(2)
nfsservctl(2)2.2Removed in 3.1
nice(2)1.0
old_adjtimex(2)2.0Alpha only; see NOTES
old_getrlimit(2)2.4Old variant of getrlimit(2) that used a different value for RLIM_INFINITY
oldfstat(2)1.0
oldlstat(2)1.0
oldolduname(2)1.0
oldstat(2)1.0
oldumount(2)2.4.116Name of the old unmount(2) syscall on Alpha
olduname(2)1.0
open(2)1.0
open_by_handle_at(2)2.6.39
open_tree(2)5.2
openat(2)2.6.16
openat2(2)5.6
or1k_atomic(2)3.1OpenRISC 1000 only
pause(2)1.0
pciconfig_iobase(2)2.2.15; 2.4   Not on x86
pciconfig_read(2)2.0.26; 2.2   Not on x86
pciconfig_write(2)2.0.26; 2.2   Not on x86
perf_event_open(2)2.6.31Was perf_counter_open() in 2.6.31; renamed in 2.6.32
personality(2)1.2
perfctr(2)2.2SPARC only; removed ㅑㅜ 2.6.34
perfmonctl(2)2.4IA-64 only
pidfd_getfd(2)5.6
pidfd_send_signal(2)5.1
pidfd_open(2)5.3
pipe(2)1.0
pipe2(2)2.6.27
pivot_root(2)2.4
pkey_alloc(2)4.8
pkey_free(2)4.8
pkey_mprotect(2)4.8
poll(2)2.0.36; 2.2
ppoll(2)2.6.16
prctl(2)2.2
pread64(2)Added as “pread” in 2.2; renamed “pread64” in 2.6
preadv(2)2.6.30
preadv2(2)4.6
prlimit64(2)2.6.36
process_madvise(2)5.10
process_vm_readv(2)3.2
process_vm_writev(2)3.2
pselect6(2)2.6.16
ptrace(2)1.0
pwrite64(2)Added as “pwrite” in 2.2; renamed “pwrite64” in 2.6
pwritev(2)2.6.30
pwritev2(2)4.6
query_module(2)2.2Removed in 2.6
quotactl(2)1.0
read(2)1.0
readahead(2)2.4.13
readdir(2)1.0
readlink(2)1.0
readlinkat(2)2.6.16
readv(2)2.0
reboot(2)1.0
recv(2)2.0See notes on socketcall(2)
recvfrom(2)2.0See notes on socketcall(2)
recvmsg(2)2.0See notes on socketcall(2)
recvmmsg(2)2.6.33
remap_file_pages(2)2.6Deprecated since 3.16
removexattr(2)2.6; 2.4.18
rename(2)1.0
renameat(2)2.6.16
renameat2(2)3.15
request_key(2)2.6.10
restart_syscall(2)2.6
riscv_flush_icache(2)4.15RISC-V only
rmdir(2)1.0
rseq(2)4.18
rt_sigaction(2)2.2
rt_sigpending(2)2.2
rt_sigprocmask(2)2.2
rt_sigqueueinfo(2)2.2
rt_sigreturn(2)2.2
rt_sigsuspend(2)2.2
rt_sigtimedwait(2)2.2
rt_tgsigqueueinfo(2)2.6.31
rtas(2)2.6.2PowerPC/PowerPC64 only
s390_runtime_instr(2)3.7s390 only
s390_pci_mmio_read(2)3.19s390 only
s390_pci_mmio_write(2)3.19s390 only
s390_sthyi(2)4.15s390 only
s390_guarded_storage(2)4.12s390 only
sched_get_affinity(2)2.6Name of sched_getaffinity(2) on SPARC and SPARC64
sched_get_priority_max(2)2.0
sched_get_priority_min(2)2.0
sched_getaffinity(2)2.6
sched_getattr(2)3.14
sched_getparam(2)2.0
sched_getscheduler(2)2.0
sched_rr_get_interval(2)2.0
sched_set_affinity(2)2.6Name of sched_setaffinity(2) on SPARC and SPARC64
sched_setaffinity(2)2.6
sched_setattr(2)3.14
sched_setparam(2)2.0
sched_setscheduler(2)2.0
sched_yield(2)2.0
seccomp(2)3.17
select(2)1.0
semctl(2)2.0See notes on ipc(2)
semget(2)2.0See notes on ipc(2)
semop(2)2.0See notes on ipc(2)
semtimedop(2)2.6; 2.4.22
send(2)2.0See notes on socketcall(2)
sendfile(2)2.2
sendfile64(2)2.6; 2.4.19
sendmmsg(2)3.0
sendmsg(2)2.0See notes on socketcall(2)
sendto(2)2.0See notes on socketcall(2)
set_mempolicy(2)2.6.6
set_robust_list(2)2.6.17
set_thread_area(2)2.6
set_tid_address(2)2.6
set_tls(2)2.6.11ARM OABI/EABI only (constant has __ARM_NR prefix)
setdomainname(2)1.0
setfsgid(2)1.2
setfsgid32(2)2.4
setfsuid(2)1.2
setfsuid32(2)2.4
setgid(2)1.0
setgid32(2)2.4
setgroups(2)1.0
setgroups32(2)2.4
sethae(2)2.0Alpha only; see NOTES
sethostname(2)1.0
setitimer(2)1.0
setns(2)3.0
setpgid(2)1.0
setpgrp(2)2.0Alternative name for setpgid(2) on Alpha
setpriority(2)1.0
setregid(2)1.0
setregid32(2)2.4
setresgid(2)2.2
setresgid32(2)2.4
setresuid(2)2.2
setresuid32(2)2.4
setreuid(2)1.0
setreuid32(2)2.4
setrlimit(2)1.0
setsid(2)1.0
setsockopt(2)2.0See notes on socketcall(2)
settimeofday(2)1.0
setuid(2)1.0
setuid32(2)2.4
setup(2)1.0Removed in 2.2
setxattr(2)2.6; 2.4.18
sgetmask(2)1.0
shmat(2)2.0See notes on ipc(2)
shmctl(2)2.0See notes on ipc(2)
shmdt(2)2.0See notes on ipc(2)
shmget(2)2.0See notes on ipc(2)
shutdown(2)2.0See notes on socketcall(2)
sigaction(2)1.0
sigaltstack(2)2.2
signal(2)1.0
signalfd(2)2.6.22
signalfd4(2)2.6.27
sigpending(2)1.0
sigprocmask(2)1.0
sigreturn(2)1.0
sigsuspend(2)1.0
socket(2)2.0See notes on socketcall(2)
socketcall(2)1.0
socketpair(2)2.0See notes on socketcall(2)
spill(2)2.6.13Xtensa only
splice(2)2.6.17
spu_create(2)2.6.16PowerPC/PowerPC64 only
spu_run(2)2.6.16PowerPC/PowerPC64 only
ssetmask(2)1.0
stat(2)1.0
stat64(2)2.4
statfs(2)1.0
statfs64(2)2.6
statx(2)4.11
stime(2)1.0
subpage_prot(2)2.6.25PowerPC/PowerPC64 only
swapcontext(2)2.6.3PowerPC/PowerPC64 only
switch_endian(2)4.1PowerPC64 only
swapoff(2)1.0
swapon(2)1.0
symlink(2)1.0
symlinkat(2)2.6.16
sync(2)1.0
sync_file_range(2)2.6.17
sync_file_range2(2)2.6.22
syncfs(2)2.6.39
sys_debug_setcontext(2)2.6.11PowerPC only
syscall(2)1.0Still available on ARM OABI and MIPS O32 ABI
sysfs(2)1.2
sysinfo(2)1.0
syslog(2)1.0
sysmips(2)2.6.0MIPS only
tee(2)2.6.17
tgkill(2)2.6
time(2)1.0
timer_create(2)2.6
timer_delete(2)2.6
timer_getoverrun(2)2.6
timer_gettime(2)2.6
timer_settime(2)2.6
timerfd_create(2)2.6.25
timerfd_gettime(2)2.6.25
timerfd_settime(2)2.6.25
times(2)1.0
tkill(2)2.6; 2.4.22
truncate(2)1.0
truncate64(2)2.4
ugetrlimit(2)2.4
umask(2)1.0
umount(2)1.0
umount2(2)2.2
uname(2)1.0
unlink(2)1.0
unlinkat(2)2.6.16
unshare(2)2.6.16
uselib(2)1.0
ustat(2)1.0
userfaultfd(2)4.3
usr26(2)2.4.8.1ARM OABI only
usr32(2)2.4.8.1ARM OABI only
utime(2)1.0
utimensat(2)2.6.22
utimes(2)2.2
utrap_install(2)2.2SPARC64 only
vfork(2)2.2
vhangup(2)1.0
vm86old(2)1.0Was “vm86”; renamed in 2.0.28/2.2
vm86(2)2.0.28; 2.2
vmsplice(2)2.6.17
wait4(2)1.0
waitid(2)2.6.10
waitpid(2)1.0
write(2)1.0
writev(2)2.0
xtensa(2)2.6.13Xtensa only

x86-32를 포함한 많은 플랫폼에서 소켓콜은 모두 socketcall(2) (glibc 래퍼 함수)를 사용하여 멀티플렉스 되었으며, System V IPC 콜은 ipc(2)를 통해 멀티플렉스 되었다.

위의 테이블에서 몇몇 슬롯이 공백으로 예약 되어 있으나 (역주 마크다운으로 바꾸면서 공백 지웠음, 나중에 각각의 시스템콜을 번역하면서 추가예정), 다음의 시스템콜은 향후 일반 커널에 추가되지 않을 예정이다. afs_syscall(2), break(2), ftime(2), getpmsg(2), gtty(2), idle(2), lock(2), madvisel(2), mpx(2), phys(2), prof(2), profil(2), putpmsg(2), security(2), stty(2), tuxcall(2), ulimit(2), and vserver(2) (unimplemented(2)의 내용도 참조할 것). 하지만 ftime(3), profil(3), 그리고 ulimit(3)은 라이브러리 루틴으로서 제공된다. phys(2)를 위한 슬롯은 커널 2.1.116 부터 예약 되었지만, umount(2); phys(2) 이 두개의 시스템콜은 아직 구현된 적이 없다. getpmsg(2)putpmsg(2) 콜은 STREAMS 지원을 위한 커널 패치에 사용되었지만, 일반 커널에 포함될 일은 없을 것이다.

*set_zone_reclaim(2)*는 2.6.13에 추가되었지만, 2.6.16에서 제거되었다. 이 시스템콜은 유저스페이스에 제공된 적은 없다.

특정 포트(아키텍처)에서 제거된 시스템콜

특정 리눅스 아키텍처에 존재했으나 삭제된 시스템콜

AVR32 (리눅스 4.12 이후 삭제)

Blackfin (리눅스 4.17 이후 삭제)

Metag (리눅스 4.17이후 삭제)

Tile (리눅스 4.17이후 삭제)

특이 사항

대략적으로 시스템콜과 상수 __NR_xxx의 선언 코드는 리눅스 커널 소스 /usr/include/asm/unistd.h파일의 sys_xxx() 루틴에서 찾아볼 수 있다. 이 안에서는 매우 많은 예외를 찾아볼 수 있는데, 이는 다소 비체계적인 방식으로 오래된 시스템콜을 새로운 시스템콜로 대체하는 과정에서 발생된 것입다. 우선 순위를 가진 플랫폼들, 이를테면 sparc, sparc64 그리고 alpha와 같은 운영체제 에뮬레이션에서는 보다 많은 시스템콜이 추가되었다; mips64 역시 32-bit 시스템콜 전체를 포함하고 있다.

많은 시간이 흐르면서 일부 시스템콜의 인터페이스 변화 역시 필수적인것이었다. 매우 공통적 이유중 하나는 구조체의 크기를 늘리거나 시스템콜에 전달해야 하는 스칼라 값의 증가가 필요했기 때문이다. 이러한 변화로 인해 일부 아키텍처(오랫동안 지속되었던 i386기반의 32-bit 아키텍처)에서는 오늘날 매우 다양한 그룹의 관련 시스템콜을 찾아볼수 있으며 (예를 들면 truncate(2), truncate64(2)) 비슷한 작업을 처리하지만 인자의 크기와 같은 세부 구현은 다르다. (앞에서 언급한 바와 같이 일반적으로 애플리케이션에서는 이러한 구분을 생각할 필요가 없다: glibc 래퍼 함수가 이러한 작업을 선처리하여 올바른 시스템콜이 호출되도록 지원하며, 오래된 바이너리를 위한 ABI 호환성을 처리해주기 때문이다.) 다양한 버전으로 존재하는 시스템콜에 대한 예제들은 다음과 같다.

64-bit 파일 접근 또는 32-bit UIDs/GIDs중 단 하나만을 지원하는 최근의 플랫폼에서는 (예: alpha, ia64, s390x, x86-64) 한개의 버전만이 GIDs/UIDs 및 파일 접근 시스템콜을 위해 제공된다. (일반적으로 32비트 플랫폼들에서) *64와 *32 두가지 모두 존재하는 플랫폼에서 둘중의 하나는 사용되지 않는다. 역주 32비트와 64비트 모두 존재하는 아키텍처에서 커널은 두가지 버전 모두를 지원하는 시스템콜을 제공하지만, 실제 시스템에 따라 둘중의 하나만 사용된다는 의미.

특수 아키텍처 세부사항 : Alpha

함께 보기

intro(2), syscall(2), unimplemented(2), errno(3), libc(7), vdso(7)

COLOPHON

이 페이지는 리눅스 매뉴얼 페이지 프로젝트 5.11 릴리즈의 일부이다. 프로젝트의 상세 설명, 버그 리포트 및 본 페이지의 최신 버전에 대한 정보는 다음의 링크에서 확인할 수 있다.
https://www.kernel.org/doc/man-pages/

About this blog
Younjin JEONG: younjin.jeong@gmail.com
Powered by Hugo with Console Theme.
Terms and Conditions