使用Python安装信号处理程序

2024-06-01 00:21:32 发布

您现在位置:Python中文网/ 问答频道 /正文

(此问题有后续内容here

我正在努力为Linux编写一个基于Python的Init系统,但是在获取Python Init脚本的信号时遇到了一个问题。从“2号杀手”页面:

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中,我有一个测试函数和一个用于调用该函数的信号处理程序设置:

^{pr2}$

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

我发现这个问题是因为我为Python init编写了一个reaping函数,以便在子进程死亡时获取它们,但是它们都只是僵尸,过了一段时间才发现Python从来没有得到SIGCHLD信号。为了确保我的环境是正常的,我编写了一个C程序来fork并让孩子向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)

Tags: devimport程序脚本signal信号initos
1条回答
网友
1楼 · 发布于 2024-06-01 00:21:32

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

另一个原因是,如果您正在进行系统调用,则在信号处理程序返回后将出现异常。您需要用重试处理程序包装所有系统调用(至少在Linux上)。在

有趣的是,您正在编写一个init替换程序。。。这有点像流程经理。proctools代码可能会引起您的兴趣,因为它确实处理SIGCHLD。在

顺便说一下,这个代码:

import signal

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

signal.signal(signal.SIGHUP, SigTest)

while True:
    signal.pause()

对我的系统有效。在

相关问题 更多 >