Установка обработчика сигналов с помощью Python

(здесь есть следующий вопрос)

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

В моем Init на основе Python у меня есть тестовая функция и настройка обработчика сигналов для вызова этой функции:

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

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

Я нашел эту проблему, потому что я написал функцию reaping для моего Python init, чтобы пожинать свои дочерние процессы по мере их смерти, но они все просто зомбировали, потребовалось некоторое время, чтобы понять, что Python никогда не получал сигнал SIGCHLD. Просто для обеспечения нормальной работы среды я написал программу C для вилки и попросил ребенка передать PID 1 сигнал, и он зарегистрировался.

Как установить обработчик сигнала, который система подтвердит, если signal.signal(SIG, FUNC) не работает?

Я собираюсь попробовать использовать ctypes для регистрации моего обработчика с помощью кода C и посмотреть, работает ли это, но я предпочитаю чистый ответ Python, если это вообще возможно.

Идеи?

(Я не программист, Im действительно в моей голове здесь: 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) 

One Solution collect form web for “Установка обработчика сигналов с помощью Python”

Обработчики сигналов в основном работают на 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() 

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

  • Как изменить пароль пользователя Linux из python
  • Python: получить выход из командной строки 'history'
  • Что означает «следующие пакеты будут заменены каналом с более высоким приоритетом»?
  • Как сделать тестирование производительности на основе производительности (эталоном) в Python
  • socket.gaierror: Имя или услуга неизвестны
  • Создание виртуальной машины с помощью версии Anaconda Python
  • mysql_config не найден при установке интерфейса mysqldb python
  • Как читать значение argv, не выходя из строки?
  • Python - лучший язык программирования в мире.