C语言 使用Python安装信号处理程序

h7wcgrx3  于 2023-10-16  发布在  Python
关注(0)|答案(2)|浏览(149)

(此问题有后续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中,我有一个测试函数和一个信号处理程序来调用该函数:

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

signal.signal(signal.SIGHUP, SigTest)

从另一个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)
bmp9r5qi

bmp9r5qi1#

信号处理器大多在Python中工作。但也存在一些问题。一个是你的处理程序不会运行,直到解释器重新进入它的字节码解释器。如果你的程序在C函数中被阻塞,信号处理程序在返回之前不会被调用。你不会在等待的地方显示代码。您是否正在使用signal.pause()?
另一个是,如果你在一个系统调用中,你会在信号处理程序返回后得到一个异常。您需要用重试处理程序 Package 所有系统调用(至少在Linux上是这样)。
有趣的是,你正在编写一个init替换...这就像一个过程管理器。您可能会对proctools代码感兴趣,因为它确实处理SIGCHLD。
顺便说一下,这段代码:

import signal

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

signal.signal(signal.SIGHUP, SigTest)

while True:
    signal.pause()

在我的系统上工作。

neekobn8

neekobn82#

import signal

from signal import api_client

# Create an instance of the Signal API client

sig = api_client('YOUR_API_KEY')

# Send a message using the Signal API

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

相关问题