在 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)
我对 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)