### C言語の場合
#include <stdio.h>
int main(void) {
puts("hello world");
return 0;
}
$ strace -o hello.log ./hello
hello world
$ cat hello.log
execve(“./hello”, [“./hello”], 0xffffda929930 /* 42 vars */) = 0
brk(NULL) = 0xaaab00641000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff9126e000
faccessat(AT_FDCWD, “/etc/ld.so.preload”, R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, “/etc/ld.so.cache”, O_RDONLY|O_CLOEXEC) = 3
newfstatat(3, “”, {st_mode=S_IFREG|0644, st_size=48255, …}, AT_EMPTY_PATH) = 0
mmap(NULL, 48255, PROT_READ, MAP_PRIVATE, 3, 0) = 0xffff9122d000
close(3) = 0
openat(AT_FDCWD, “/lib/aarch64-linux-gnu/libc.so.6”, O_RDONLY|O_CLOEXEC) = 3
read(3, “\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0\267\0\1\0\0\0\340u\2\0\0\0\0\0″…, 832) = 832
newfstatat(3, “”, {st_mode=S_IFREG|0755, st_size=1637400, …}, AT_EMPTY_PATH) = 0
mmap(NULL, 1805928, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xffff91074000
mmap(0xffff91080000, 1740392, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0xffff91080000
munmap(0xffff91074000, 49152) = 0
munmap(0xffff91229000, 15976) = 0
mprotect(0xffff91208000, 61440, PROT_NONE) = 0
mmap(0xffff91217000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x187000) = 0xffff91217000
mmap(0xffff9121d000, 48744, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xffff9121d000
close(3) = 0
set_tid_address(0xffff9126ef30) = 313040
set_robust_list(0xffff9126ef40, 24) = 0
rseq(0xffff9126f600, 0x20, 0, 0xd428bc00) = 0
mprotect(0xffff91217000, 16384, PROT_READ) = 0
mprotect(0xaaaac9350000, 4096, PROT_READ) = 0
mprotect(0xffff91273000, 8192, PROT_READ) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
munmap(0xffff9122d000, 48255) = 0
newfstatat(1, “”, {st_mode=S_IFCHR|0620, st_rdev=makedev(0x88, 0x3), …}, AT_EMPTY_PATH) = 0
getrandom(“\xbf\x00\x96\xce\x0e\x82\xcd\xa2”, 8, GRND_NONBLOCK) = 8
brk(NULL) = 0xaaab00641000
brk(0xaaab00662000) = 0xaaab00662000
write(1, “hello world\n”, 12) = 12
exit_group(0) = ?
+++ exited with 0 +++
色々はかれていますが、write()がシステムコールです。
write(1, “hello world\n”, 12) = 12
### Pythonの場合
#include <stdio.h>
int main(void) {
puts("hello world");
return 0;
}
$ strace -o hello.py python3 ./hello.py
システムコールってよく聞くけど、システムコールの理解が深まった気がする。
Average: CPU %user %nice %system %iowait %steal %idle
Average: all 1.62 0.00 1.69 0.19 0.00 96.50
Average: 0 1.56 0.00 1.79 0.11 0.00 96.54
Average: 1 1.68 0.00 1.60 0.26 0.00 96.46
ユーザモードはuser, niceで systemがカーネルモード、idelは何も動いていない状態です。