# Doom-htop: 프로세스 모니터링 도구 htop 위에서 Doom 실행하기

> Clean Markdown view of GeekNews topic #14443. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=14443](https://news.hada.io/topic?id=14443)
- GeekNews Markdown: [https://news.hada.io/topic/14443.md](https://news.hada.io/topic/14443.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-04-22T10:09:42+09:00
- Updated: 2024-04-22T10:09:42+09:00
- Original source: [github.com/0x0mer](https://github.com/0x0mer/doom-htop)
- Points: 2
- Comments: 1

## Topic Body

### DOOM을 htop으로 구현하기

#### 빌드 방법
- `doomgeneric` 디렉토리로 이동
- `make -j8` 명령어로 빌드
- WAD 파일(게임 데이터)이 필요함. 이 프로젝트에는 `freedoom1.wad`가 포함되어 있음(Freedoom 프로젝트에 모든 크레딧). 또는 고전 무료 쉐어웨어 버전 `DOOM1.wad`를 다운로드해서 사용 가능

#### 실행 방법
- 중요한 작업은 미리 저장 권장
- 오래된 노트북에서도 잘 동작함을 확인
- 아래 명령어 실행:
  ```bash
  sed -i 's/update_process_names=0/update_process_names=1/' ~/.config/htop/htoprc
  sudo ./doom-htop -iwad freedoom1.wad
  htop -d 1 -s M_VIRT
  ```
- `doom-htop`과 `htop` 실행 순서는 상관없음
- 키보드 디바이스를 열기 위해 `sudo` 필요. 안전상 우려된다면 `sudo` 없이 실행해서 그래픽만 감상 가능
- `htop`의 `-d 1`은 10FPS 갱신 속도를 위한 것. `-s M_VIRT`는 가상 메모리 할당 순으로 프로세스를 정렬하기 위함
- `sed` 명령어는 `htop`이 기본적으로 프로세스 이름을 매번 갱신하지 않기 때문에 필요

#### 동작 원리
- https://github.com/ozkl/doomgeneric 프로젝트를 포크해서 작업
- `main.c`, `keylogger.c`, `ascii_stuff.c` 파일 추가 및 일부 수정
- 간단한 이미지-ASCII 변환기 작성 (`ascii_stuff.c`의 긴 if문)
- 메인 doom 프로세스가 ASCII 이미지의 줄 수만큼 자식 프로세스를 생성하고, 각 프로세스와 공유 메모리 세그먼트 생성
- 메인 프로세스는 각 줄을 해당 프로세스의 메모리 세그먼트에 복사하고, 각 자식 프로세스는 자신의 세그먼트에서 읽어서 `argv[0]`을 덮어씀
- 원래는 CPU 사용량으로 프로세스를 정렬하려 했으나 어려움. 리눅스의 `nice`도 고려했으나 사용자가 설정 가능한 값이 19개뿐이라 포기
- 가상 메모리 할당량을 사용하는 아이디어를 떠올림. 프로세스마다 특정함
- 모든 자식 프로세스가 정확히 같은 메모리를 할당해도 `htop`에서 올바른 순서로 프레임이 표시됨. 아마도 동일한 경우 생성 시간 순으로 정렬되는 것으로 추측
- 키보드 디바이스를 여는 간단한 키로거 작성. `htop` 실행 여부와 상관없이 백그라운드에서 게임이 항상 실행됨

#### 지원 플랫폼
- Ubuntu 22.04에서만 테스트함
- WSL과 Arch에서는 키보드 디바이스 이름이 다름. 포팅 필요

#### 문제 해결
1. 키보드가 작동하지 않는 경우
   - `main.c`의 `KEYBOARD_DEVICE` 매크로 확인. 플랫폼마다 다를 수 있음
   - `ll /dev/input/by-path` 명령어로 `kbd`가 포함된 디바이스 선택
2. 프레임이 멈춘 경우 
   - `sed` 명령어가 작동하지 않았을 수 있음
   - `htop`에서 F2 -> "Display options" -> "Update process names on every refresh" 체크
3. `sed: can't read /home/&lt;user&gt;/.config/htop/htoprc: No such file or directory` 오류
   - `htop`을 한 번도 실행하지 않아서 발생. `htop` 실행 후 종료하고 `sed` 다시 실행
4. 메인 doom 프로세스가 죽고 좀비 프로세스만 남은 경우
   - `sudo pkill doom-htop` 실행

#### 개선 사항
- 방향키로 이동할 때 `htop` 화면이 움직여서 불편함
- `htop` 시작 후 포커스를 변경하는 것으로 해결 가능 (예: `a` 키 눌러서 프로세서 선택 메뉴 열기)

#### FAQ
1. Q: 왜 만들었나요? 
   A: 재미있을 것 같아서요.

#### 라이선스
- Freedoom은 BSD 스타일 라이선스 (`freedoom-license.txt` 참조)
- 나머지 코드는 GPL로 추정

### GN⁺의 의견
- ASCII 아트로 3D 게임 화면을 표현하는 것은 신선한 아이디어. C로 htop처럼 화면에 그래픽을 그리는 좋은 예제가 될 것 같음
- 단순히 화면만 ASCII 아트로 바꾸는게 아니라 실제 게임 엔진과 연동해서 구현했다는 점이 인상적
- 기존 `doomgeneric` 프로젝트를 잘 활용해서 적은 양의 코드로 구현한 점도 높이 평가할만함
- 키보드 입력을 받기 위해 리눅스 디바이스를 직접 여는 것은 WSL이나 다른 OS 환경에서 동작하지 않을 수 있음. OS에 독립적인 키 입력 라이브러리 사용을 검토해볼만함
- 공유 메모리를 사용해서 부모-자식 프로세스간 ASCII 프레임 데이터를 주고 받는 아이디어가 흥미로움. IPC에 대해 공부하기 좋은 예제
- ASCII 그래픽을 htop의 프로세스 이름에 넣는 아이디어도 창의적. 하지만 htop이 프로세스 이름 변경에 의해 화면이 움직이는 등 부작용도 있음. 개선이 필요해보임
- GPL 라이선스인 것으로 추정되나 명확하지 않음. 코드 재사용시 라이선스 확인 필요

## Comments



### Comment 24588

- Author: neo
- Created: 2024-04-22T10:09:42+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=40104410) 
이 댓글들은 htop을 이용해서 ASCII로 렌더링된 Doom 게임을 프로세스로 실행하는 프로젝트에 대한 반응을 담고 있음. 주요 내용은 다음과 같음:

- **PSDoom과의 비교**: PSDoom이 Doom을 이용해 프로세스 관리를 하는 반면, 이 프로젝트는 그 반대로 프로세스 매니저를 이용해 Doom을 플레이하는 것임.
- **기술적 평가**: ASCII로 렌더링해서 프로세스 이름에 넣는 것 자체는 어렵지 않지만, htop을 렌더링 엔진으로 활용한 발상이 인상적이고 소프트웨어 해킹의 정수를 보여줌. 
- **개발자의 능력에 대한 존경**: 이런 프로젝트를 만들 시간과 능력이 있는 개발자들을 보면 자신의 능력에 자신감을 잃게 됨. 
- **Doom 통합 트렌드**: 이제는 Doom에 일상적인 것들을 통합하는 것도 고려해볼 만함. 할 일 목록이나 캘린더 등을 상상해볼 수 있음.
- **해커 정신 찬양**: 재미를 위한 해킹 프로젝트가 인기를 얻는 것을 보니 기쁘고, 해커 정신이 아직 살아있음을 보여줌. 
- **Bad Apple 연상**: Windows 작업 관리자에서 구현된 Bad Apple 영상을 연상시킴.
- **Doom의 미래**: 앞으로 Doom이 어디까지 구현될 수 있을지 상상하기 어려움.
