0

我的程序启动了一个子进程,它必须在初始化后向父进程发送某种信号。如果我可以在父级中设置一个处理程序,这将是完美的,它在发送此信号时被调用。有什么办法吗?

阿连迪

4

3 回答 3

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,请不要绝望——这里有一个反向移植。

于 2009-09-08T11:49:08.763 回答
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 系统中,当通过信号传递调用使用 signal() 建立的处理程序时,信号的处置将重置为 SIG_DFL,并且系统不会阻止信号的进一步实例的传递。System V 也为 signal() 提供了这些语义。这很糟糕,因为信号可能在处理程序有机会重新建立自己之前再次传递。此外,相同信号的快速传递可能导致处理程序的递归调用。

我建议阅读整个signal(2)手册页。

于 2009-09-08T11:00:27.160 回答
1

您可以使用 Python 标准库中的信号模块来注册信号处理程序。然后子进程将使用正常的信号发送机制。

于 2009-09-08T10:44:05.540 回答