GN⁺: Doom-htop: 프로세스 모니터링 도구 htop 위에서 구동되는 클래식 DOOM 게임
(github.com/0x0mer)DOOM을 htop으로 구현하기
빌드 방법
-
doomgeneric
디렉토리로 이동 -
make -j8
명령어로 빌드 - WAD 파일(게임 데이터)이 필요함. 이 프로젝트에는
freedoom1.wad
가 포함되어 있음(Freedoom 프로젝트에 모든 크레딧). 또는 고전 무료 쉐어웨어 버전DOOM1.wad
를 다운로드해서 사용 가능
실행 방법
- 중요한 작업은 미리 저장 권장
- 오래된 노트북에서도 잘 동작함을 확인
- 아래 명령어 실행:
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에서는 키보드 디바이스 이름이 다름. 포팅 필요
문제 해결
- 키보드가 작동하지 않는 경우
-
main.c
의KEYBOARD_DEVICE
매크로 확인. 플랫폼마다 다를 수 있음 -
ll /dev/input/by-path
명령어로kbd
가 포함된 디바이스 선택
-
- 프레임이 멈춘 경우
-
sed
명령어가 작동하지 않았을 수 있음 -
htop
에서 F2 -> "Display options" -> "Update process names on every refresh" 체크
-
-
sed: can't read /home/<user>/.config/htop/htoprc: No such file or directory
오류-
htop
을 한 번도 실행하지 않아서 발생.htop
실행 후 종료하고sed
다시 실행
-
- 메인 doom 프로세스가 죽고 좀비 프로세스만 남은 경우
-
sudo pkill doom-htop
실행
-
개선 사항
- 방향키로 이동할 때
htop
화면이 움직여서 불편함 -
htop
시작 후 포커스를 변경하는 것으로 해결 가능 (예:a
키 눌러서 프로세서 선택 메뉴 열기)
FAQ
- Q: 왜 만들었나요? A: 재미있을 것 같아서요.
라이선스
- Freedoom은 BSD 스타일 라이선스 (
freedoom-license.txt
참조) - 나머지 코드는 GPL로 추정
GN⁺의 의견
- ASCII 아트로 3D 게임 화면을 표현하는 것은 신선한 아이디어. C로 htop처럼 화면에 그래픽을 그리는 좋은 예제가 될 것 같음
- 단순히 화면만 ASCII 아트로 바꾸는게 아니라 실제 게임 엔진과 연동해서 구현했다는 점이 인상적
- 기존
doomgeneric
프로젝트를 잘 활용해서 적은 양의 코드로 구현한 점도 높이 평가할만함 - 키보드 입력을 받기 위해 리눅스 디바이스를 직접 여는 것은 WSL이나 다른 OS 환경에서 동작하지 않을 수 있음. OS에 독립적인 키 입력 라이브러리 사용을 검토해볼만함
- 공유 메모리를 사용해서 부모-자식 프로세스간 ASCII 프레임 데이터를 주고 받는 아이디어가 흥미로움. IPC에 대해 공부하기 좋은 예제
- ASCII 그래픽을 htop의 프로세스 이름에 넣는 아이디어도 창의적. 하지만 htop이 프로세스 이름 변경에 의해 화면이 움직이는 등 부작용도 있음. 개선이 필요해보임
- GPL 라이선스인 것으로 추정되나 명확하지 않음. 코드 재사용시 라이선스 확인 필요
Hacker News 의견
이 댓글들은 htop을 이용해서 ASCII로 렌더링된 Doom 게임을 프로세스로 실행하는 프로젝트에 대한 반응을 담고 있음. 주요 내용은 다음과 같음:
- PSDoom과의 비교: PSDoom이 Doom을 이용해 프로세스 관리를 하는 반면, 이 프로젝트는 그 반대로 프로세스 매니저를 이용해 Doom을 플레이하는 것임.
- 기술적 평가: ASCII로 렌더링해서 프로세스 이름에 넣는 것 자체는 어렵지 않지만, htop을 렌더링 엔진으로 활용한 발상이 인상적이고 소프트웨어 해킹의 정수를 보여줌.
- 개발자의 능력에 대한 존경: 이런 프로젝트를 만들 시간과 능력이 있는 개발자들을 보면 자신의 능력에 자신감을 잃게 됨.
- Doom 통합 트렌드: 이제는 Doom에 일상적인 것들을 통합하는 것도 고려해볼 만함. 할 일 목록이나 캘린더 등을 상상해볼 수 있음.
- 해커 정신 찬양: 재미를 위한 해킹 프로젝트가 인기를 얻는 것을 보니 기쁘고, 해커 정신이 아직 살아있음을 보여줌.
- Bad Apple 연상: Windows 작업 관리자에서 구현된 Bad Apple 영상을 연상시킴.
- Doom의 미래: 앞으로 Doom이 어디까지 구현될 수 있을지 상상하기 어려움.