使用 Python 安装信号处理程序

问题描述 投票:0回答:2

(这个问题有后续这里

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

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

signal.signal(signal.SIGHUP, SigTest)

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

kill -HUP 1

我发现这个问题是因为我为我的 Python init 编写了一个收割函数,以便在子进程死亡时收割它们,但它们都僵死了,花了一段时间才发现 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)
python c linux init signal-handling
2个回答
1
投票

信号处理程序主要在 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()

适用于我的系统。


0
投票

导入信号

从信号导入 api_client

创建 Signal API 客户端的实例

sig = api_client('YOUR_API_KEY')

使用 Signal API 发送消息

sig.send_message(recipient='TOKEN', message='Hello world!')

© www.soinside.com 2019 - 2024. All rights reserved.