gpt4 book ai didi

python - 使用 Python 安装信号处理程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:11:03 26 4
gpt4 key购买 nike

(这个问题有后续 here )

我正在尝试为 Linux 编写一个基于 Python 的 Init 系统,但是我在向我的 Python 初始化脚本获取信号时遇到了问题。来自“man 2 kill”页面:

The only signals that can be sent to process ID 1, the init process,  are  those for which init has explicitly installed signal handlers.

在我基于 Python 的 Init 中,我有一个测试函数和一个调用该函数的信号处理程序设置:

def SigTest(SIG, FRM):
print "Caught SIGHUP!"

signal.signal(signal.SIGHUP, SigTest)

如果我从另一个 TTY(init 脚本在另一个 tty 上执行 sh)发送信号,它会被完全忽略并且永远不会打印文本。 kill -HUP 1

我发现这个问题是因为我为我的 Python init 写了一个收割函数来收割它的子进程,但他们都死了,我花了一段时间才发现 Python 从未收到 SIGCHLD 信号。为了确保我的环境健全,我编写了一个 C 程序来 fork 并让 child 向 PID 1 发送一个信号,它确实注册了。

如果 signal.signal(SIG, FUNC) 不工作,我该如何安装系统将确认的信号处理程序?

我将尝试使用 ctypes 将我的处理程序注册到 C 代码中,看看是否可行,但如果可能的话,我宁愿使用纯 Python 答案。

想法?

(我不是程序员,我真的很困惑 :p )

下面的测试代码...

import os
import sys
import time
import signal


def SigTest(SIG, FRM):
print "SIGINT Caught"

print "forking for ash"
cpid = os.fork()
if cpid == 0:
os.closerange(0, 4)
sys.stdin = open('/dev/tty2', 'r')
sys.stdout = open('/dev/tty2', 'w')
sys.stderr = open('/dev/tty2', 'w')
os.execv('/bin/ash', ('ash',))

print "ash started on tty2"

signal.signal(signal.SIGHUP, SigTest)

while True:
time.sleep(5.0)

最佳答案

信号处理程序主要在 Python 中工作。但是也有一些问题。一个是你的处理程序不会运行,直到解释器重新进入它的字节码解释器。如果您的程序在 C 函数中被阻塞,则在返回之前不会调用信号处理程序。您不会在等待的地方显示代码。你在使用 signal.pause() 吗?

另一个是,如果你在系统调用中,你会在信号处理程序返回后得到一个异常。您需要使用重试处理程序包装所有系统调用(至少在 Linux 上)。

有趣的是,您正在编写一个 init 替代品……这有点像进程管理器。 proctools您可能会对代码感兴趣,因为它确实处理 SIGCHLD。

顺便说一句,这段代码:

import signal

def SigTest(SIG, FRM):
print "SIGINT Caught"

signal.signal(signal.SIGHUP, SigTest)

while True:
signal.pause()

在我的系统上工作。

关于python - 使用 Python 安装信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5826824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com