요즘 Admin Tool을 윈도용으로 제작하고 있는 와중에 기존에 서버와 웹로봇 프로그램에 win32 api 코드를 넣어야할 일들이 생겼다.
난 오래전부터 플랫폼 독립적인 코딩을 하길 원했다. 왜냐면 지금 하고 있는 코딩이 나중에 Linux나 Unix에 포팅할때 발목을 잡을것이기 때문이다. 그래서 Admin Tool에서 어떻게 하면 프로세스 종료를 좀더 유연하게 할까 고민을 했다. 다행히 회사가 윈도 프로그래머는 넘쳐나는 곳이라 이래저래 정보도 수집해봤지만 역시나 해당 프로세스에 win32 API를 넣어야 된다는 판단이 들었다. 거의 모든 운영체제에 존재하는 SIGNAL이라는 걸 쓸라고도 해봤지만 윈도에서는 시그널을 KILL 할수 있는 명령이 없음을 알수 있었다.(있으면 좀 알려주세요!) 그러니까 SINTERM 시그널을 등록해 유닉스의 “kill -9 pid” 같은 명령으로 외부에서 프로세스를 죽일수 있는 방법 말이다.
그래서 윈도 이벤트를 등록후 WaitForSingleObject을 이용해 종료하는 방법으로 방향을 잡았다.
그런데 이게 윈도용 API라 코딩하는데 어찌나 껄끄럽던지.
뭐 C코딩을 한다면야 전처리기를 이용해 코딩하고 컴파일 하는 번거로움이 있는데 스크립트 언어는 동일한 코드로 어디서든지 돌릴수 있는 스크립트 언어만의 특징이 있다.(당연하다.)
def thread_of_to_get_windows_event(deadsignal):
"""윈도우 이벤트 대기 함수 스레드로 생성"""
if OS_NAME.startswith('windows'):
import win32event
win32event.WaitForSingleObject(deadsignal, win32event.INFINITE)
if END_POT == 0:
termhandler()
else:
return
스크립트 언어는 Line by Line 형식으로 실행시간 기계어 코드 변환이 일어난다. 그래서 위의 if문에서 이게 windows가 아닐경우 윈도 API 라이브러리가 로딩이 안된다. 만일 컴파일 언어라면 Unix에서 컴파일시 win32 API가 없다고 에러가 쭉 나오겠지.
이렇게 해서 이 함수를 어디서든지 돌릴수가 있다. 코드한줄 수정없이 컴파일 옵션 변환 없이 어디서든지 돌아간다.
그럼 Win32 API를 마구 써도 괜찮을거 같다는 생각이 팍팍 드는군. 최소한 코드가 적당한 수준으로 지저분해 지겠지만 노가다는 적어지잖아.
알고리즘 고완 고안할 시간도 부족한데 이런 고민좀 줄여보자고!
스크립트 언어다운 플랫폼 독립적 코딩 by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.