Skip to content
Beside the Wheel
Search
Ctrl
K
Cancel
Email
GitHub
Select theme
Dark
Light
Auto
공부
(5)
spot 인스턴스에서 서버 가용성 개선하기
eBPF로 서버 성능 Profiling하는 법: Pyroscope의 구현 살펴보기
정수론부터 RSA까지
strace로 shaka-packager 버그 추적
Kubernetes The Hard Way
TIL
(956)
AI
(43)
DevOps
(230)
Network
(61)
OS
(155)
개발
(113)
데이터베이스
(64)
서버
(72)
수학
(20)
알고리즘
(24)
암호학
(32)
언어
(113)
컴퓨터구조
(5)
코드
(24)
독후감
(43)
과학
(1)
사회
(2)
산문
(3)
소설
(12)
인문
(11)
자기계발
(7)
철학
(7)
생각
(6)
고민
변화에 대하여
의식의 영역에 대하여
본질을 보려면
짧은 생각들
소유냐 존재냐
회고
(14)
2022.03-04 대덕소마고 입학소감/다짐
2022.05-08 프로젝트와 인간관계
2022.09-2023.02 불안과 판단
2023.03-07 DMS 리더 회고
2023.08-11 나는 누구인가?
2023.12 더 많은 걸 배우기 위한 경험
2024.01-02 회사 인턴 회고
2024.03-04 고3 근황
2024.05-07 고등학교 마무리
2024.08-12 첫 회사
2025.01-03 입출력
2025.03-08 효능감이란 무엇일까
2025.09-12 연말회고
2026.01-08 담론
Email
GitHub
Select theme
Dark
Light
Auto
태그: system-call
총 15개의 글이 있습니다.
TOCTOU
system-call
2026. 3. 17.
TOCTOU(Time-of-Check to Time-of-Use)는 자원의 상태를 검사(check)한 뒤 사용(use)하기까지의 틈에 그 자원이 바뀌어 생기는 race condition이다. access + open `access()`로 권한을 확인하고 `open()`으로 파일을 여는 코드를 생각해보자. c if (access("/tmp/file", W_OK) == 0) { int fd = open("/tmp/file", O_WRONLY); write(fd, data, len); close(fd); } setuid 프로그램에서 이 코드가 돌아간다고 하자. `access()`는 real UID 기준으로 권한을 검사하고, `open()`은 effective UID(ro
AF_ALG
system-call
2026. 3. 14.
AF_ALG는 Linux 커널의 Crypto API를 유저스페이스에 소켓 인터페이스로 노출하는 소켓 패밀리이다. 커널 2.6.38에서 도입되었다. 일반적으로 암호화 연산은 OpenSSL 같은 유저스페이스 라이브러리로 수행한다. 하지만 커널 내부에도 자체 암호화 엔진(Crypto API)이 존재하고, AF_ALG는 이 엔진을 `socket()` → `bind()` → `accept()` → `sendmsg()`/`recv()` 흐름으로 사용할 수 있게 해준다. 네트워크 소켓에서 데이터를 주고받듯이, 평문을 커널에 보내면 커널이 연산을 수행하고 결과를 돌려주는 구조이다. 커널 Crypto API는 하드웨어 가속(AES-NI, ARM CE 등)을 자동으로 활용한다. AF_ALG를 쓰면 유저스페이스 프로그램이
errno
system-call
2025. 11. 30.
errno는 시스템 콜이나 라이브러리 함수가 실패했을 때 에러 원인을 나타내는 전역 변수다. c include extern int errno; exit code가 프로세스 종료 상태를 표현하는 것과 비슷하게 errno는 시스템 콜 에러 상태를 나타내는 정수 반환 값이다. | 구분 | errno | exit code | |------|-------|-----------| | 범위 | 시스템 콜 에러 | 프로세스 종료 상태 | | 접근 | `errno` 변수 | `$?` 또는 `waitpid` | | 값 | 양수 (1~133+) | 0~255 | | 0의 의미 | 에러 없음 | 성공 | 주요 errno 값 리소스 관련 | errno | 값 | 설명 | |-------|---|---
futex
system-call
2025. 11. 30.
futex(Fast Userspace muTEX)는 리눅스에서 제공하는 저수준 동기화 메커니즘이다. 사용자 공간에서 빠르게 락을 처리하고, 경합이 발생할 때만 커널로 진입하여 효율적인 동기화를 제공한다. c include include int futex(int *uaddr, int futex_op, int val, const struct timespec *timeout, int *uaddr2, int val3); `uaddr`: 동기화에 사용할 메모리 주소 (보통 32비트 정수) `futex_op`: 수행할 연산 (FUTEX_WAIT, FUTEX_WAKE 등) `val`: 연산에 따라 다른 의미 (WAIT에서는 기대값, WAKE에서는 깨울 쓰레드 수)
strace
system-call
2025. 11. 30.
strace는 프로세스가 호출하는 시스템 콜과 시그널을 추적하는 리눅스 디버깅 도구다. bash strace [options] command [args] strace [options] -p pid 기본 옵션 | 옵션 | 설명 | |------|------| | `-p pid` | 실행 중인 프로세스에 attach | | `-o file` | 출력을 파일로 저장 | | `-e trace=syscalls` | 특정 syscall만 추적 | | `-c` | 통계 요약 출력 | 멀티쓰레드/프로세스 옵션 | 옵션 | 설명 | |------|------| | `-f` | fork된 자식 프로세스도 추적 | | `-ff` | 각 프로세스/쓰레드별 별도 파일 생성 (`-o` 필요) |
epoll
system-call
2024. 4. 21.
Epoll은 리눅스에서 select의 단점을 보완하여 사용할 수 있도록 만든 I/O 통지 모델이다. 파일 디스크립터를 커널이 관리하기 때문에 CPU는 계속해서 파일 디스크립터의 상태 변화를 감시할 필요가 없고, 관찰대상의 정보를 매번 전달하지 않아도 된다. select는 어느 파일 디스크립터에 이벤트가 발생하였는지 찾기 위해 전체 파일 디스크립터에 대해서 순차검색을 위한 `FD_ISSET` 루프를 돌려야 하지만, Epoll는 이벤트가 발생한 파일 디스크립터들만 구조체 배열을 통해 넘겨주므로 메모리 카피에 대한 비용이 줄어든다. level vs edge trigger epoll의 이벤트 탐지 방법은 level-trigger와 edge-trigger 두 가지가 있다. level-trigger
ioctl
system-call
2024. 4. 21.
`ioctl()``, `write()`를 사용하지만, 하드웨어를 제어하거나 상태 정보를 확인하려면 `ioctl()`를 이용해야한다. c include int ioctl(int d, int request, ...); `d`: open한 디바이스 드라이버의 fd 값이다 `request`: 디바이스에게 전달할 명령이다. 이 명령에 따라서 디바이스를 컨트롤 할 수 있다. `/usr/include/asm/ioctl.h` 헤더파일에 ioctl의 커맨드 번호를 작성하는데 사용해야하는 매크로가 정의
perf event
system-call
2024. 4. 19.
c include /* Definition of PERF_* constants */ include /* Definition of HW_* constants */ include /* Definition of SYS_* constants */ include int syscall(SYS_perf_event_open, struct perf_event_attr *attr, pid_t pid, int cpu, int group_fd, unsigned long flags); `perf_event_open`은 성능 모니터링을 설정하기 위한 시스템 콜이다. `perf_event_open()`는 성능 정보를 측정할 수 있는 파일 디스크립
rlimit
system-call
2024. 4. 14.
`getrlimit()`와 `setrlimit()` c include include include int getrlimit(int resource, struct rlimit *rlim); int setrlimit(int resource, const struct rlimit *rlim); `getrlimit()`과 `setrlimit()`는 자원의 제한값을 조회하거나 설정하기 위해서 사용하는 시스템 콜이다. 자원의 종류를 뜻하는 resource는 다음중 하나이다. c RLIMIT_CPU /* 초 단위의 CPU 시간 */ RLIMIT_FSIZE /* 최대 파일 크기 */ RLIMIT_DATA /* 최대 데이타 크기 */ RL
file 관련 systemcall
system-call
2024. 3. 13.
open 파일을 열고 file descriptor 반환 file descriptor 실행중인 프로그램과 하나의 파일 사이에 연결된 개방 상태 음수가 아닌 정수형 값 파일 개방이 실패하면 -1이 됨 커널에 의해서 관리 bash NAME open, openat – open or create a file for reading or writing SYNOPSIS include int open(const char *path, int oflag, [mode_t mode], ...); int openat(int fd, const char *path, int oflag, ...); path: 개방할 파일의 경로 이름을 가지고 있는 문자열의 포인터 of
fork와 exec
system-call
2024. 3. 13.
fork c pid_t fork(void); 새로운 자식 프로세스를 생성할 때 사용하는 시스템 호출 함수이다. 자식 프로세스는 부모 프로세스의 PCB를 그대로 상속받는다. 함수의 반환값은 자식 프로세스에게 `0`, 부모에게는 자식 프로세스의 id이다. c pid_t vfork(void); `vfork()`도 `fork()`와 마찬가지로 자식 프로세스를 생성하는 함수이다. `fork()`와 달리 자식 프로세스가 먼저 실행됨을 보장한다. 따라서 생성된 프로세스가 exec계열 함수를 이용하여 새 프로그램으로 실행하는 경우에 주로 사용한다. `vfork()`로 프로세스를 생성한 경우 부모의 주소 영역을 참조하지 않을 것이라고 생각하여 부모 프로세스의 공간을 자식에게 복사하지 않는다
mmap
system-call
2024. 3. 13.
c include include ifdef _POSIX_MAPPED_FILES void * mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void *start, size_t length); endif `mmap`은 파일이나 장치를 메모리에 대응시키거나 푸는 시스템콜이다. `fd`로 지정된 파일(혹은 다른 객체)에서 `offset`을 시작으로 `length` 바이트 만큼을 `start` 주소로 대응시키도록 한다. --- 명시적인 `mmap`을 사용해 운영체제에 가상 메모리를 요청하면 운영체제는 RAM의 페이지를 즉시 할당해주지 않고, 가상 주소 범위만 제공한다.
thread 관련 systemcall
system-call
2024. 3. 13.
우선 스레드란, 프로세스 내에 실행되는 흐름의 단위이다. 프로세스는 반드시 1개 이상의 쓰레드를 가지고 있다. 프로세스와 다르게 한 프로세스 안의 스레드들은 메모리 자원을 공유한다. `pthread_create` `pthread_create`는 말 그대로 thread를 생성하는 시스템 콜이다. 이 시스템 콜을 사용하는 경우 `-pthread` 옵션과 함께 컴파일해야 한다. 각 옵션의 의미는 다음과 같다. 1. thread: 성공적으로 함수가 호출되면 이 포인터에 thread ID가 저장된다. 이 인자로 넘어온 값을 통해서 `pthread_join`과 같은 함수를 사용할 수 있다. 2. attr: 스레드의 특성을 정의한다. 만약 스레드의 속성을 지정하려고 한다면 `pthrea
wait과 waitpid
system-call
2024. 3. 13.
wait c include pid_t wait(int *_Nullable wstatus); wait은 child process가 종료될 때까지 기다렸다가 child process가 종료되면 종료된 child process의 값을 반환한다. 만약 실패하는 경우 `-1`을 반환한다. status에는 child process가 어떤 방식으로 종료되었는지가 담겨있다. 관련 매크로로 상세한 정보를 알아낼 수 있다. `WIFEXITED(status)` : exit, _exit, _Exit 혹은 main에서의 return으로 종료되었는지 여부를 반환한다. `WEXITSTATUS(status)` : `WIFEXITED`의 값이 참인 경우 exit code를 반환한다. `WIFSI
리눅스 시스템 프로그래밍 프로젝트
system-call
2024. 3. 13.
선택과목으로 리눅스 시스템 프로그래밍을 수강하며 진행한 프로젝트 코드 및 배운점에 대해 정리한다. 이 프로젝트에서 개발하는 Application은 아래의 기능을 포함한다. 1. Text File(`swblocks.txt`)에 기록된 S/W 블록 정보로부터 여러 S/W 블록들을 초기화시킨다. 기록된 파일에는 파일 이름과 파라미터가 아래와 같이 세미콜론으로 구분되어 있다. SwBlock1; Param1; Param2; Param3 SwBlock2; Param1; Param2 SwBlock3; Param1 2. S/W 블록의 이상동작(블럭 다운) 발생 시 재초기화를 수행한다. 즉, 해당 블록에 해당하는 프로세스를