Установка обработчика сигнала с Python - PullRequest
1 голос
/ 29 апреля 2011

(есть ответ на этот вопрос здесь )

Я пытаюсь написать систему инициализации на основе Python для Linux, но у меня проблема с получением сигналов для моего скрипта инициализации 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 у меня есть тестовая функция и настройка обработчика сигнала для вызова этой функции:

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

signal.signal(signal.SIGHUP, SigTest)

Из другого TTY (скрипт init выполняет sh для другого tty), если я посылаю сигнал, он полностью игнорируется и текст никогда не печатается. kill -HUP 1

Я обнаружил эту проблему, потому что я написал функцию пожирания для моего Python init, чтобы пожинать его дочерние процессы, когда они умирают, но все они просто зомбированы, потребовалось некоторое время, чтобы понять, что Python никогда не получал сигнал SIGCHLD. Просто для того, чтобы убедиться, что моя среда нормальна, я написал программу на C для разветвления, и чтобы ребенок отправил 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)

1 Ответ

1 голос
/ 29 апреля 2011

Обработчики сигналов в основном работают на Python.Но есть некоторые проблемы.Во-первых, ваш обработчик не будет работать, пока интерпретатор не введет свой интерпретатор байт-кода.если ваша программа заблокирована в функции C, обработчик сигнала не вызывается, пока не вернется.Вы не показываете код, где вы ждете.Используете ли вы signal.pause ()?

Другое: если вы используете системный вызов, вы получите исключение после того, как обработчик singal вернется.Вам нужно обернуть все системные вызовы обработчиком повторов (по крайней мере, в Linux).

Интересно, что вы пишете замену инициализации ... Это что-то вроде менеджера процессов.Код proctools может вас заинтересовать, поскольку он обрабатывает SIGCHLD.

Кстати, этот код:

import signal

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

signal.signal(signal.SIGHUP, SigTest)

while True:
    signal.pause()

Работает ли в моей системе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...