Linux señales de bloqueo a Python init

Esta es una continuación de mi otra publicaciónInstalando el manejador de señal con Python. En resumen, Linux bloquea todas las señales al PID 1 (incluido SIGKILL) a menos que Init haya instalado un controlador de señal para una señal en particular; para evitar el pánico del kernel si alguien enviara una señal de terminación a PID1. El problema que he tenido es que parece que lasignal module en Python no instala manejadores de señal de una manera que el sistema reconozca. Aparentemente, mi script de Python Init ignoraba completamente todas las señales, ya que creo que estaban siendo bloqueadas.

Parece que he encontrado una solución; utilizandoctypes para instalar los manejadores de señal consignal()unción @ en libc (en este caso uClibc). A continuación se muestra un inicio de prueba basado en Python. Abre un shell en TTY2 desde el cual puedo enviar señales a PID1 para probar. Parece que funciona en el KVM que estoy usando para las pruebas (estoy dispuesto a compartir la VM con cualquier persona interesada)

¿Es esta la mejor forma de solucionar este problema? ¿Hay una 'mejor' manera de instalar los manejadores de señal sin el módulo de señal? (No estoy en absoluto preocupado con portabilidad)

¿Es esto un error en Python?

#!/usr/bin/python

import os
import sys
import time

from ctypes import *

def SigHUP():
    print "Caught SIGHUP"
    return 0

def SigCHLD():
    print "Caught SIGCHLD"
    return 0

SIGFUNC = CFUNCTYPE(c_int)
SigHUPFunc = SIGFUNC(SigHUP)
SigCHLDFunc = SIGFUNC(SigCHLD)

libc = cdll.LoadLibrary('libc.so.0')
libc.signal(1, SigHUPFunc) # 1 = SIGHUP
libc.signal(17, SigCHLDFunc) # 17 = SIGCHLD

print "Mounting Proc: %s" % libc.mount(None, "/proc", "proc", 0, None)

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"

print "sleeping"
while True:
    time.sleep(0.01)

Respuestas a la pregunta(2)

Su respuesta a la pregunta