2011-11-15 3 views
2

나는 동일한 프로세스에서 (파이썬 프로그램, 자사의 다중 스레드 응용 프로그램)가 일어난 :파이썬이 리눅스에서 EINTR를 선택하고 처리하기위한 임시 해결책은 무엇입니까? 내 최근 프로젝트 중 하나에서

  • 부스트 :: AVT PvAPI SDK에 링크 라이브러리, 즉에 파이썬 모듈 가장 넓은 의미에서 카메라로부터 이미지 프레임을 얻는 드라이버. 이 라이브러리 (PvApi SDK)는 내부적으로 수 밀리 초마다 SIGALRM을 생성합니다.

  • pyserial을 사용하여 일부 직렬 I/O를 수행하려는 다른 일반 Python 모듈. 이것은 파이썬의 래퍼 select.select을 POSIX select에 사용합니다. 신호가 다른 모듈에 의해 생성 될 때마다 인터럽트 (errno == EINTR)로 판명되었습니다.

  • 파이썬의 time.sleep 호출에서 동일한 문제가 발생할 수 있습니다. 내부적으로 사용되는 POSIX sleep.

이러한 문제는 잠자기 및 선택 항목이 (설명서에 따라) 중단되지 않으므로 Windows에 존재하지 않습니다. 그리고 이러한 문제는 C/C++에서 많은 문제가되지 않습니다. 호출이 중단 된 경우 호출을 다시 시작할 수 있기 때문입니다.

그러나,이 사건을 처리하지 않습니다 파이썬 구현 (source code /Modules/selectmodule.c) (EINTR)와 같은, 내가 파이썬에서 사용하는 내 자신의 C/C++ 시리얼 드라이버와 절전 기능을 구현하기 위해 강제로 무엇입니까? 아니면이 프로젝트를 위해 파이썬에서 물러나시겠습니까? 파이썬이 프로그래밍을 훨씬 더 쉽게하기 때문에 비슷한 문제가 있거나 좋은 해결 방법이나 간단한 해결책을 발견하면 매우 흥미 롭습니다. 지금 당장 필자는 Python 모듈에 필요한 수정을 직접 수행 할 능력이 없습니다. 아니면 다른 옵션을 놓친 것일까 요?

아이디어가 있으십니까?

답변

0

signal.sigintterupt을 사용하여 SIGALRM 신호 재시작 시스템 호출을 자동으로 수행하십시오. 또는 signal.signal(signal.SIGALRM, signal.SIG_IGN)을 사용하여 알람 신호를 무시할 수 있습니다. 아무 것도 사용하지 않는다고 가정 할 때.

+0

[맨 페이지] (http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html)에 따라 자동으로'select'와'sleep' (그리고 몇 가지 다른 호출들)은'signal.siginterrupt'에 대해 가능하지 않고 신호를 비활성화시키는 것은 효과가 없습니다. 아마 멀티 스레드 응용 프로그램이기 때문입니다. – moooeeeep

관련 문제