2008년 3월 9일 일요일

종료상태 넘기기 실수담

며칠 전 디바이스의 레지스터값을 읽고 쓰는 작은 프로그램을 하나 포팅하였다. 타겟 환경은 QNX라는 유닉스 계열의 임베디드 OS였는데, 포팅이 끝난 후 프로그램의 동작 방식을 조금 수정해야 할 일이 생겼다. 원래 프로그램은 읽은 레지스터 값을 화면에 출력하고 종료하는 형태로 실행되는데, 다른 프로그램으로 읽은 레지스터 값을 넘겨주고 종료하도록 동작 방식을 바꾸어야 했다. 부모 프로그램에서 spawn( fork + exec를 합쳐놓은....)을 사용하여 레지스터 읽는 프로그램을 실행하고... 읽은 레지스터 값을 어떻게 받아올까를 잠시 고민했다. 4바이트 레지스터값을 넘기기 위해서 IPC를 사용하기가 귀찮아 간편한 방법을 고민하던 중 exit를 사용하여 프로세스 종료상태를 넘기는 대신 읽은 레지스터값을 넘기는 방법을 생각하기에 이르렀다. QNX에서 제공하는 spawn이라는 API는 P_WAIT옵션을 주면 실행된 자식프로세스가 끝날 때까지 block되어 있다가 호출한 프로세스에게 종료 상태값을 return하는 기능이 있었다. exit() API 문서에도 exit의 인자로 int형으로 명시되어 있어 spawn과 exit를 사용히면 4바이트 레지스터 값을 넘기는데 별 문제가 없어보였지만, 실제로는 잘 동작하지 않았다. 레지스터의 값이 255 이상일 경우에 읽은 레지스터 값이 종료 상태값(echo $?로 확인 가능)으로 넘어오지 않는 것이었다. exit가 int형 파라메터를 가지지만 실제로 unix계열의 OS에서 프로세스 종료 상태는 0~255사이의 값만 가진다는 것을 나중에야 알았다. (혹시 특정 계열 OS에서 255이상을 종료 상태값으로 가지는 환경이 있으면 알려주시기 바랍니다.)

댓글 없음: