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

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

  • Получайте дельта мыши с помощью Python! (в Linux)
  • Я хочу подождать как файлового дескриптора, так и мьютекса, какой рекомендуемый способ сделать это?
  • Нет графического окна в matplotlib в Linux Shell Windows 10
  • Импорт модуля Python из Bash
  • Безопасная среда Python в Linux
  • Ошибка Opencv на python
  • Как установить конкретные vim-привязки в Ipython 5.0.0
  • python конвертирует документы Microsoft Office в обычный текст на linux
  • Обнаружение линии в центре видео OpenCV
  • Использование Python для запуска браузера (Chromium) и изменения URL-адреса
  • Что мне нужно для чтения баз данных Microsoft Access с помощью Python?
  • Python - лучший язык программирования в мире.