각 시스템(Linux, FreeBSD, Solaris, 등등)에서 공통으로 쓸 수 있는 정규화된 ps의 source가 있지 않을까 싶었는데 찾아보고 나니 '그런 것 따윈 없다' 였다. (...)
결론부터 이야기하자면, Process List의 목록을 가져오려면 커널 영역과 직접 연결해야 한다. 이것을 Linux는 libproc 이라는 라이브러리를 통해 사용하고, FreeBSD는 libkvm이라는 라이브러리를 사용한다. libproc은 Linux라는 시스템을 조금이라도 아는 사람이라면 한번쯤은 들어봤던 proc, 그러니까 /proc 경로에 있는 그 어마무시한 놈을 지칭한다. 그러니까 proc File System에서 커널 내용을 읽어 오는 것이고, 요것은 별로 특이할 것은 없겠다. libkvm도 비슷한 동작을 하는 것 같다. /dev/mem 경로의 device를 열어 내용을 읽는 것으로 보인다. (대충 이름만 봐도 짐작이 가는 것처럼, 메모리 자체의 디바이스를 의미하는 것 같다.)
libproc과 ps의 source가 들어 있는 procps라는 패키지는 다음 홈페이지에서 다운받을 수 있다.
openproc으로 열어 readproctab2에 넘긴다. 재미있는 것은 0xdeadbeaful 이라는 놈인데, 저렇게 넘기는데도 된다. (함수처럼 콜하고 응답도 받는데. 정체는 모르겠다. libproc의 소스에도 없고, 구글 검색에도 나오지 않는다. 뭐지 이건;) 이 함수들은 proc/readproc.c 에 구현되어 있다.. 고 해 봐야 정말 별게 없다. /proc 의 내용들을 opendir로 열어서 안의 내용을 browse 한다. 정말 특이할게 없는 구조다.
FreeBSD의 각종 패키지 소스야 port를 쓰면 되지만, 특별히 따로 구하기 싶다면 아래 사이트에서 참고할 수 있다.