2011-11-02 5 views
3

현재 os.fork 및 os.system 명령을 사용하여 여러 명령을 설정하고 실행하고 있습니다. resource.setrlimit을 통해 시간과 메모리 제한을 설정했는데 정상적으로 작동하는 것 같습니다. 그러나 각 프로그램은 메모리 뚜껑 때문에 스스로 충돌하는 방식을 가지고 있습니다 - Python 프로그램이 MemoryError를 던지고 C++ 프로그램에 잘못된 할당이있을 수 있습니다.os.system의 메모리 제한을 감지하는 방법

내가 알고 싶은 것은 어떻게 탐지 할 수 있습니까? os.system 명령이 메모리 제한 제한 (시간 초과 또는 다른 완료 방법으로 가정 됨)으로 인해 실행을 완료 한 경우. 내가 성공하지 않고 다음을 시도했다 :

try: 
    status = os.system(command) 
except MemoryError: 
    # Never actually makes it here... 

편집을 : 정말 지금은 유닉스 시스템에만 관심입니다.

+0

"Unix에서 반환 값은 wait()에 지정된 형식으로 인코딩 된 프로세스의 종료 상태입니다. POSIX는 C system() 함수의 반환 값 의미를 지정하지 않으며, 파이썬 함수의 반환 값은 시스템에 따라 다릅니다. " 그래서 당신은 자신의 시스템의 실제 오류에이 값들을 매핑하는 dict을 할 수 있습니다. – lc2817

+0

해당 값이 응용 프로그램에 종속적이지 않습니까? 즉, C++ 개발자는 그가 마음에 들었다면 exit (42)를 호출 할 수 있었고 그 의미가 무엇인지 알지 못한다. – haz

+0

물론 코드를 몇 가지 표준을 따라야합니다. 그러나 그것은 두 프로그램이 올바르게 통신하기를 원할 때마다 사실입니다. – lc2817

답변

0

는 해당 시스템을 (보이는 창에 http://blog.tsul.net/2008/04/ossystem-and-its-return-value.html

참조)와 "그 PID 및 종료 상태를 포함하는 튜플을 반환합니다) (대기) 모두 항상 유닉스 나 맥 시스템 (에 0

을 반환 표시 : 프로세스를 죽인 신호 번호 인 하위 바이트와 신호 번호가 0 인 경우 상위 바이트가 종료 상태 인 16 비트 숫자로, 하위 바이트의 상위 비트는 코어 파일 가용성 : 매킨토시, 유닉스. "

신호가 무엇인지 알기 위해 하위 바이트를보고이를 사용하여 종료/종료 된 이유를 확인할 수 있어야합니다.

+0

신호 번호는 항상 0으로 표시되지만 종료 코드는 다양하며 명목상으로 실행될 때만 0 인 것으로 보입니다 ...이 테스트가 내가하는 모든 경우에 대해 작동하는지 테스트합니다. – haz

+0

내가 다루고있는 것 때문에 일하는 것 같습니다. 시간 초과가 발생했거나 "나쁜 것"이 발생했음을 의미하도록 동작을 변경해야합니다 (메모리 오류 포함). 종료 코드는 불행하게도 프로그램마다 다릅니다 (0은 항상 성공적으로 완료되었음을 나타냄). 감사합니다. – haz

0

그런 시스템 호출은 반환 값을 감싸고 예외를 발생시키지 않을 것입니다.

는 서브 프로세스 모듈과 자신을 그렇게해야합니다 : 그것은 명시 적으로 짓을 설명하지 않는 한 때문에 메모리 오류로 실패 할 경우 http://docs.python.org/library/subprocess.html#module-subprocess

을, 당신이 만드는 부르는 체제에 따라, 당신은 알 수 없습니다.

관련 문제