29

我有这个监听 USR1 信号的代码

import signal
import os
import time

def receive_signal(signum, stack):
    print 'Received:', signum

signal.signal(signal.SIGUSR1, receive_signal)
signal.signal(signal.SIGUSR2, receive_signal)

print 'My PID is:', os.getpid()

while True:
    print 'Waiting...'
    time.sleep(3)

这在我发送信号时有效kill -USR1 pid

但是如何从上述 python 脚本中发送相同的信号,以便在 10 秒后自动发送USR1并接收它,而无需打开两个终端来检查它?

4

2 回答 2

56

您可以使用os.kill()

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

将其放在您要从中发送信号的代码中的任何位置。

于 2014-01-07T13:00:18.543 回答
6

如果您愿意 catchSIGALRM而不是SIGUSR1,请尝试:

signal.alarm(10)

否则,您将需要启动另一个线程:

import time, os, signal, threading
pid = os.getpid()
thread = threading.Thread(
  target=lambda: (
    time.sleep(10),
    os.kill(pid, signal.SIGUSR1)))
thread.start()

因此,这个程序:

import signal
import os
import time

def receive_signal(signum, stack):
    print 'Received:', signum

signal.signal(signal.SIGUSR1, receive_signal)
signal.signal(signal.SIGUSR2, receive_signal)
signal.signal(signal.SIGALRM, receive_signal)  # <-- THIS LINE ADDED

print 'My PID is:', os.getpid()

signal.alarm(10)                               # <-- THIS LINE ADDED

while True:
    print 'Waiting...'
    time.sleep(3)

产生这个输出:

$ python /tmp/x.py 
My PID is: 3029
Waiting...
Waiting...
Waiting...
Waiting...
Received: 14
Waiting...
Waiting...
于 2013-02-26T02:56:30.830 回答