2011-08-04 40 views
0

好吧,所以這可能是一個奇怪的情況,但請忍受我。如何給自己發信號(相同的PID)?

我有經由SWIG接口調用了一個C++類Python程序。我來到了一個點,我必須從C++庫中異步發送信號(以更新狀態)Python代碼。最初我沒有低效的輪詢輪詢標誌。我想用SIGUSR1來替換它。

所以,問題是,我發現,即使這些單獨的「線程」,它們共享相同的PID。這是Python和C++程序都報告相同的PID。我使用kill發送了信號,Python代碼在它的處理程序中捕獲了它,但是它並沒有像我期望的那樣中斷代碼。我嘗試了兩種在Python代碼中等待信號的方法,第一個py調用Python的signal.pause,我認爲它應該在接收信號時被搶佔。另一個是簡單的time.sleep,它應該做的基本相同的事情 - 當信號通過時返回。

出於某種原因,這是行不通的 - 我的C++代碼發送信號時,Python代碼接收它並調用處理程序,但是,暫停/睡眠調用一去不復返。

如果能夠正確信號相同的過程,你會怎麼辦呢?

(如果這只是愚蠢原諒我,繼續前進)

+0

注意:這是一個GNU電臺節目,所以主要的Python線程創建包括C++信號處理塊的流圖。我想從一個C++塊發出主要的Python程序信號。 –

回答

2

信號是不是在這裏工作的工具。通常情況下,這將是線程間同步原語的作業,從thread模塊如

然而事件的對象,這是不容易從C++操縱Python線程鎖。所以我會用的

  • 一個pipe老套,但很簡單,方法,其中Python的線程讀取,以及C++線程,當它想喚醒Python來寫只有一個字節。
+0

好主意;管道可能是最簡單的解決方案,即使使用某種類型的posix鎖仍然是一個更好的主意。 – SingleNegationElimination

+0

我喜歡它,但我不確定實現。我讀過的大部分管道示例都涉及分叉進程,並將其中一個進程stdout連接到其他標準進程。一個Unix過濾器。在我看來,這似乎不太適用,因爲C++不是一個單獨的程序。我需要找到一些使用管道的Python/C++ IPC的例子。謝謝! –

+0

好吧,經過一分鐘的思考,我認爲FIFO(命名管道)就是我所需要的... –

2

如果你在同一個程序,我不知道你會需要信號,在這種情況下什麼。看看observer pattern。如果你有你的python事件處理程序訂閱你的C++庫中的事件,你可以一起避免所有的信號。