2011-11-15 31 views
2

在我最近的一個項目,我碰巧在同一個進程有(Python程序,其多線程應用程序):Python在Linux中選擇和處理EINTR的任何解決方法?

  • 一個boost :: Python模塊到對AVT PvAPI SDK鏈接庫,即在最廣泛的意義上來說是一個驅動程序來獲取相機的圖像幀。這個庫(PvApi SDK)每幾毫秒產生一個SIGALRM

  • 另一個普通的Python模塊,打算使用pyserial來做一些串行I/O。這反過來使用Python的包裝select.select POSIX select。每當信號由其他模塊產生時,結果中斷(errno == EINTR)。

  • 在任何Python的調用time.sleep中都可以看到同樣的問題,內部使用的POSIX sleep

這些問題在Windows中顯然不存在,因爲睡眠和選擇不會被任何信號中斷(根據文檔)。而這些問題在C/C++中並不是什麼大問題,因爲你可以(也應該)在它們被中斷時重新啓動這些調用。但是,由於Python實現(source code /Modules/selectmodule.c)不處理這種情況(EINTR),我是否被迫實現了自己的C/C++串行驅動程序和睡眠函數以在Python中使用?或者爲了這個項目離開Python?由於Python使編程變得如此簡單,我非常感興趣,如果任何人有類似的問題,並找到一個很好的解決方法或簡單的修復。目前,我沒有能力自己爲Python模塊制定必要的修復。或者,也許我錯過了其他一些選擇?

任何想法?

回答

0

嘗試使用signal.sigintterupt使SIGALRM信號自動重啓系統調用。或者您可以使用signal.signal(signal.SIGALRM, signal.SIG_IGN)忽略警報信號,假設您沒有使用它。

+0

根據[manpage](http://www.kernel.org/doc/man-pages/online/pages/man7/signal.7.html)自動重新啓動'select'和'sleep'(和一些其他調用)不可能用於'signal.siginterrupt',禁用信號也不行。可能是因爲它是一個多線程應用程序。 – moooeeeep

相關問題