2009-09-08 12 views
0

我的程序啓動了一個子進程,它在初始化之後必須向父進程發送某種信號。如果我可以在父項中設置一個處理程序,在發送此信號時調用它,這將是完美的。有什麼辦法可以做到嗎?從正在運行的進程中調用函數

Alendit

回答

4

如果您使用Python 2.6,則可以使用標準庫中的multiprocessing模塊,特別是管道和隊列。從文檔簡單的例子:

from multiprocessing import Process, Pipe 

def f(conn): #This code will be spawned as a new child process 
    conn.send([42, None, 'hello']) #The child process sends a msg to the pipe 
    conn.close() 

if __name__ == '__main__': 
    parent_conn, child_conn = Pipe() 
    p = Process(target=f, args=(child_conn,)) # prepare to spawn the child 
    p.start() # spawn it 
    print parent_conn.recv() # prints "[42, None, 'hello']" 
    p.join() #wait for child to exit 

如果您使用Python 2.4或2.5,不要絕望 - 一個補丁包,可用here

+0

非常感謝,首先我有點害怕,因爲我實際上必須用python2.5來做,但後臺運行得很好。 – user164039 2009-09-10 10:20:04

1

您可以使用signal module Python標準庫註冊一個信號處理程序。該子過程然後將使用正常的信號發送機制。

2

父代碼:

import signal 

def my_callback(signal, frame): 
    print "Signal %d received" % (signal,) 

signal.signal(signal.SIGUSR1, my_callback) 
# start child 

兒童代碼:

import os 
import signal 

signal.kill(os.getppid(), signal.SIGUSR1) 

小心使用這種形式的IPC的,因爲它有它的問題,如:

在原來的Unix系統,當使用建立的 處理程序信號()被 傳遞信號調用,信號的配置 將被重置爲 SIG_DFL,並且系統沒有 塊傳遞信號的其他實例 。 System V還爲信號()提供了 這些語義。這 是壞的,因爲在處理程序 有機會重新建立自己之前,信號可能會再次發送 。 此外,相同信號的快速交付可能導致處理程序的遞歸調用 。

我推薦閱讀整個signal(2)手冊頁。

+0

如果有辦法將參數發送到父函數,那麼您的解決方案將是完美的。 – user164039 2009-09-08 13:20:17

+0

隨着我的回答,有:-) – 2009-09-08 14:35:29