处理python中的USR1信号



我还不熟悉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整除时向prog1.py发送一个USR1信号

所以首先我运行prog1.py,这样我就可以提取它的pid并将其传递给prog2。然后我运行pro2 .py以获得prog1的pid,并在每次n被10整除时向prog1发送USR1信号。但是这里发生的事情是不同的:在运行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读取它。此外,你会很快学会在信号处理程序中运行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)

最新更新