# PatchworkOS – “모든 것이 파일” 철학을 UNIX보다 더 엄격히 구현한 새로운 OS 소개

*SEO 키워드: **PatchworkOS**, **파일 시스템**, **운영체제 개발***

---

# # 📌 서론 – 왜 새로운 OS가 필요할까?

우리는 일상에서 **UNIX** 기반 시스템이 “모든 것이 파일이다”는 원칙을 부분적으로만 적용하는 모습을 자주 보게 됩니다. 파일, 디바이스, 소켓, 심지어 프로세스 간 통신까지도 각각 별도의 인터페이스를 제공하죠. 이런 복잡성은 특히 **운영체제 개발**을 처음 시작하는 초보자에게 큰 장벽이 됩니다.

그런데 **PatchworkOS**는 이 철학을 **Plan9**에서 영감을 받아 **완전히** 구현합니다. 파일 하나만으로도 소켓 통신, 프로세스 생성, 시그널(신호) 처리까지 가능하도록 설계돼, 기존 UNIX‑like 시스템보다 훨씬 직관적인 API를 제공합니다. 이번 포스트에서는 PatchworkOS가 어떻게 “Everything Is a File”을 실현했는지, 그리고 핵심 기능인 **소켓**, **프로세스 스폰**, **시그널**을 간단히 살펴보겠습니다.

---

# # 🗂️ 1. 파일 시스템이 곧 인터페이스 – PatchworkOS의 핵심 설계

- **통합 파일 네임스페이스**

  - `/dev`, `/net`, `/proc` 등 기존 UNIX와 달리 **모든 리소스가 하나의 파일 트리**에 존재합니다.

  - 예를 들어 네트워크 소켓을 열 때는 `open('/net/tcp/0')`만 하면 되며, 반환된 파일 디스크립터를 `read/write`로 바로 사용합니다.

- **동적 파일 생성**

  - 프로세스를 생성하면 `/proc/<pid>` 디렉터리가 자동으로 생성되고, 그 안에 `stdin`, `stdout`, `stderr` 뿐 아니라 **시그널 파일**(`sigint`, `sigterm` 등)도 포함됩니다.

- **간단한 권한 관리**

  - 파일 권한(`rwx`)이 곧 리소스 접근 권한이 되므로, 복잡한 시스템 콜 대신 `chmod`만으로 보안 정책을 적용할 수 있습니다.

> **핵심 포인트** : 파일 입출력(`open`, `read`, `write`, `close`)만 알면 OS 전반을 제어할 수 있다는 점이 PatchworkOS의 가장 큰 매력입니다.

---

# # 🌐 2. 소켓 통신 – 파일 하나로 네트워크 연결

## # 2.1 소켓 열기

```
c

int fd = open('/net/tcp/0', O_RDWR);

```

- `0`은 **첫 번째 TCP 소켓**을 의미합니다.

- 파일 디스크립터 `fd`는 일반 파일과 동일하게 `read`와 `write`를 사용할 수 있습니다.

## # 2.2 연결 및 데이터 전송

```
c

write(fd, 'GET / HTTP/1.0\r\n\r\n', 18);

char buf[256];

int n = read(fd, buf, sizeof(buf));

```

- `write`는 바로 네트워크 패킷으로 변환됩니다.

- `read`는 수신된 데이터를 버퍼에 채워 반환합니다.

## # 2.3 장점

- **시스템 콜이 하나** 뿐이라 코드가 간결합니다.

- 파일 디스크립터 기반이므로 `select`/`poll` 대신 **표준 파일 API**로 멀티플렉싱이 가능합니다.

---

# # ⚙️ 3. 프로세스 스폰 – 파일 하나로 새로운 작업 실행

## # 3.1 프로세스 생성 방법

```
c

int pid = open('/proc/spawn', O_WRONLY);

write(pid, 'bin/hello_world', 15);

close(pid);

```

- `/proc/spawn` 파일에 실행 파일 경로를 쓰면 새로운 프로세스가 **자동으로 생성**됩니다.

- 반환값은 **새로운 프로세스의 PID**이며, 이후 `/proc/<pid>` 디렉터리를 통해 제어합니다.

## # 3.2 입출력 연결

```
c

int in  = open('/proc/1234/stdin',  O_WRONLY);

int out = open('/proc/1234/stdout', O_RDONLY);

write(in, 'Hello Patchwork!', 16);

read(out, buf, 64);

```

- 부모와 자식 간의 I/O도 파일 입출력으로 처리됩니다.

## # 3.3 장점

- `fork`, `execve` 같은 복잡한 시스템 콜이 사라지고 **단일 파일 인터페이스**만으로 프로세스 관리가 가능합니다.

---

# # 🚦 4. 시그널(신호) 처리 – 파일로 이벤트를 받다

## # 4.1 시그널 파일 열기

```
c

int sig = open('/proc/1234/sigint', O_RDONLY);

```

- `sigint` 파일을 **읽기 전용**으로 열면 해당 프로세스에 `SIGINT`가 발생했을 때 **데이터가 채워집니다**.

## # 4.2 시그널 대기 및 처리

```
c

char buf[1];

read(sig, buf, 1);   // SIGINT가 오면 블록 해제

printf('Ctrl+C 가 눌렸습니다!\n');

```

- `read`가 반환될 때마다 시그널이 발생했음을 의미합니다.

## # 4.3 시그널 전송

```
c

int target = open('/proc/4567/sigterm', O_WRONLY);

write(target, '', 0);   // SIGTERM 전송

```

- 다른 프로세스의 시그널 파일에 **빈 데이터를 쓰면** 해당 시그널이 전달됩니다.

## # 4.4 장점

- `kill`, `signal` 함수 대신 **파일 쓰기**만으로 시그널을 주고받을 수 있어, **코드 가독성**이 크게 향상됩니다.

---

# # 🏁 결론 – PatchworkOS와 함께 “파일 하나로 모든 것”을 경험해보세요

PatchworkOS는 **파일 시스템**을 모든 시스템 리소스의 **공통 인터페이스**로 승격시켜, 복잡한 시스템 콜을 **단순 파일 입출력**으로 대체했습니다.

- **소켓** → `/net/...` 파일

- **프로세스 스폰** → `/proc/spawn` 파일

- **시그널** → `/proc/<pid>/sig*` 파일

이러한 설계는 **운영체제 개발**을 처음 배우는 초보자에게 큰 학습 곡선을 낮춰 주며, 동시에 고급 개발자에게는 **일관된 API**로 생산성을 높여 줍니다.

> **지금 바로** PatchworkOS 레포지토리([GitHub](https://github.com/KaiNorberg/PatchworkOS))를 클론하고, 간단한 “Hello World” 프로그램을 파일 입출력만으로 구현해 보세요. 여러분의 첫 번째 파일 기반 OS 프로젝트가 곧 시작됩니다!

---

*읽어 주셔서 감사합니다. 도움이 되셨다면 댓글과 공유, 그리고 GitHub 스타를 눌러 주세요! 🚀*
