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および受信できるようにするにはどうすればよいですか?2つの端末を開いて確認する必要はありません。

4

2 に答える 2

56

os.kill()を使用できます:

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

これを、シグナルを送信したいコード内の任意の場所に配置します。

于 2014-01-07T13:00:18.543 に答える
6

SIGALRMの代わりにキャッチしたい場合は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 に答える