在 python 中处理 USR1 信号

Handling USR1 signals in python

我对 python 中的信号还是个新手,我想知道我的程序有什么问题。

我有 prog1.py :

import signal 
import os
import time


pid = os.getpid()

def receive(signum, stack):
    print("Received",signum)

signal.signal(signal.SIGUSR1, receive)

print("PID is : ",pid)

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

prog2.py

from prog1 import pid

n = 0

while True:
    n = n + 1
    print(n)
    if ( n % 10 == 0):
        os.kill(pid, signal.SIGUSR1)

所以我想在这里做的是每次 n 被 10 整除时发送一个 USR1 信号到 prog1.py。

所以首先我 运行 prog1.py 所以我可以提取它的 pid 并将它传递给 prog2。 然后我 运行 prog2.py 获取 prog1 的 pid 并在每次 n 被 10 整除时发送一个 USR1 信号给 prog1。 但是这里发生的事情是不同的:在 运行ning prog1 我得到这个输出(除外):

PID is :  15355
Waiting
Waiting
Waiting
Waiting
...

但是当我 运行 prog2 时,我得到了这个输出(我没想到):

PID is :  15629
Waiting
Waiting
Waiting
Waiting
...

我做错了什么?

如果你不想从 prog2.py 中分叉 prog1.py 但 运行 他们 独立地,你必须在某处保存 prog1.py 的 PID 文件系统并让 prog2.py 读取它。此外,您将很快了解到 信号处理程序中的 运行ning print() 是个坏主意 - 信号处理程序应该是 非常快且 运行 可重入函数。在一天结束时,代码 可能看起来像这样:

prog1.py:

#!/usr/bin/env python3

import signal
import os
import time


pid = os.getpid()

with open("/tmp/prog1.pid", "w") as pidfile:
    pidfile.write(f"{pid}\n")

GOT = 0


def receive(signum, stack):
    global GOT
    GOT = 1


signal.signal(signal.SIGUSR1, receive)

print("PID is : ", pid)

while True:
    if GOT == 1:
        print("Received signal.SIGUSR1")
        GOT = 0

    print("Waiting")
    time.sleep(3)

prog2.py:

#!/usr/bin/env python3

import os
import signal

with open("/tmp/prog1.pid", "r") as pidfile:
    prog1_pid = int(pidfile.readline())

N = 0

while True:
    N = N + 1
    if N % 10 == 0:
        os.kill(prog1_pid, signal.SIGUSR1)