signal

УстанавливаСт ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ для асинхронных событий

Π­Ρ‚ΠΎΡ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ прСдоставляСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ для использования ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сигналов Π² Python.

ΠžΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°

Ѐункция signal.signal () позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала. УстановлСно нСбольшоС количСство ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: SIGPIPE игнорируСтся (поэтому ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… записи Π² ΠΊΠ°Π½Π°Π»Π°Ρ… ΠΈ сокСтах ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΠ± ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΡ… Python), Π° SIGINT прСобразуСтся Π² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ KeyboardInterrupt, Ссли Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ» Π΅Π³ΠΎ.

ПослС установки ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ сигнала остаСтся установлСнным Π΄ΠΎ Π΅Π³ΠΎ явного сброса (Python эмулируСт интСрфСйс стиля BSD нСзависимо ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ), Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° для SIGCHLD, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт Π±Π°Π·ΠΎΠ²ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сигналов Python

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигналов Python Π½Π΅ выполняСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигналов Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня (C). ВмСсто этого ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигналов Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня устанавливаСт Ρ„Π»Π°Π³, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сообщаСт Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала Python Π² Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ инструкции Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°). Π­Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ послСдствия:

  • БСссмыслСнно ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ синхронныС ошибки, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ SIGFPE ΠΈΠ»ΠΈ SIGSEGV, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Π΅ нСдопустимой ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π² ΠΊΠΎΠ΄Π΅ C. Python вСрнСтся ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° сигнала Π² ΠΊΠΎΠ΄ C, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, вСроятно, снова Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ сигнал, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ зависанию Python. Начиная с Python 3.3, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок для сообщСния ΠΎ синхронных ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ….

  • Π”ΠΎΠ»Π³ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ вычислСния, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° C (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сопоставлСниС рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ для большого объСма тСкста), ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ количСства Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, нСзависимо ΠΎΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… сигналов. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сигналов Python Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Π½Ρ‹ ΠΏΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠΈ вычислСний.

Π‘ΠΈΠ³Π½Π°Π»Ρ‹ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈ

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ сигналов Python всСгда Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π² основном ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Python, Π΄Π°ΠΆΠ΅ Ссли сигнал Π±Ρ‹Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ сигналы нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ срСдство ΠΌΠ΅ΠΆΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ взаимодСйствия. ВмСсто этого Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹ синхронизации ΠΈΠ· модуля threading.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ основной ΠΏΠΎΡ‚ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅ модуля

ИзмСнСно Π² вСрсии 3.5: пСрСчислСнныС Π½ΠΈΠΆΠ΅ константы, связанныС с сигналом (SIG*), ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ (SIG_DFL, SIG_IGN) ΠΈ sigmask (SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK), Π±Ρ‹Π»ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Ρ‹ Π² пСрСчислСния enums. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ getsignal (), pthread_sigmask (), sigpending () ΠΈ sigwait () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹Π΅ пСрСчислСния enums.

Π’ ΠΌΠΎΠ΄ΡƒΠ»Π΅ signal ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

  • signal.SIG_DFL - выполняСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для сигнала

  • signal.SIG_IGN - ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ просто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Π΄Π°Π½Π½Ρ‹ΠΉ сигнал

  • signal.SIGABRT

  • signal.SIGALRM - сигнал Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π° ΠΎΡ‚ alarm(2) Π² Unix

  • signal.SIGBREAK

  • signal.SIGBUS

  • signal.SIGCHLD - Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ процСсс остановлСн ΠΈΠ»ΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π΅Π½

  • Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ...

  • signal.SIGUSR1 - опрСдСляСмый ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ сигнал 1

  • signal.SIGUSR2 - опрСдСляСмый ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ сигнал 2

  • Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ...

ΠœΠΎΠ΄ΡƒΠ»ΡŒ signal опрСдСляСт ΠΎΠ΄Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅:

  • signal.ItimerError exception

ΠœΠΎΠ΄ΡƒΠ»ΡŒ signal опрСдСляСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • signal.alarm () - отправляСт сигнал SIGALRM Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ количСство сСкунд

  • signal.getsignal ()

  • signal.strsignal ()

  • signal. valid_signals ()

  • signal.pause () - приостанавливаСт процСсс, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ сигнал

  • Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ...

  • signal.signal () - Π·Π°Π΄Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для сигнала

  • Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ...

ΠŸΡ€ΠΈΠΌΠ΅Ρ€

Π’ΠΎΡ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Он ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ alarm (), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ врСмя оТидания открытия Ρ„Π°ΠΉΠ»Π°; это ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, Ссли Ρ„Π°ΠΉΠ» ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ устройства, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ зависанию os.open () Π½Π° Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ врСмя. РСшСниС - ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ 5-сСкундный сигнал Ρ‚Ρ€Π΅Π²ΠΎΠ³ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ΠΌ Ρ„Π°ΠΉΠ»Π°; Ссли опСрация длится слишком Π΄ΠΎΠ»Π³ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½ Π°Π²Π°Ρ€ΠΈΠΉΠ½Ρ‹ΠΉ сигнал, ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

import signal, os

def handler(signum, frame):
    print('Signal handler called with signal', signum)
    raise OSError("Couldn't open device!")

# УстановитС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сигнала ΠΈ 5-сСкундный Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊ
signal.signal(signal.SIGALRM, handler)
signal.alarm(5)

# Π­Ρ‚ΠΎΡ‚ open () ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²ΠΈΡΠ°Ρ‚ΡŒ бСсконСчно
fd = os.open('/dev/ttyS0', os.O_RDWR)

signal.alarm(0)          # ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π±ΡƒΠ΄ΠΈΠ»ΡŒΠ½ΠΈΠΊ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ для SIGPIPE

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π²Ρ‹Π²ΠΎΠ΄Π° вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ€Ρƒ Ρ‚Π°ΠΊΠΈΠΌ инструмСнтам, ΠΊΠ°ΠΊ head(1), Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ сигнала SIGPIPE Π²Π°ΡˆΠ΅ΠΌΡƒ процСссу, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ Π΅Π³ΠΎ стандартного Π²Ρ‹Π²ΠΎΠ΄Π° закроСтся Ρ€Π°Π½ΡŒΡˆΠ΅. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ возникновСнию ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ BrokenPipeError: [Errno 32] Broken pipe. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ этот случай, ΠΎΠ±Π΅Ρ€Π½ΠΈΡ‚Π΅ Π²Π°ΡˆΡƒ Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

import os
import sys

def main():
    try:
        # ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ большой Π²Ρ‹Π²ΠΎΠ΄ (ваш ΠΊΠΎΠ΄ замСняСт этот Ρ†ΠΈΠΊΠ»)
        for x in range(10000):
            print("y")
        # ΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ здСсь, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ SIGPIPE
        # Π½Π°Ρ…ΠΎΠ΄ΡΡΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ этого Π±Π»ΠΎΠΊΠ° try.
        sys.stdout.flush()
    except BrokenPipeError:
        # Python сбрасываСт стандартныС ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅;
        # ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΉΡΡ Π²Ρ‹Π²ΠΎΠ΄ Π½Π° devnull,
        # Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΉ BrokenPipeError ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹
        devnull = os.open(os.devnull, os.O_WRONLY)
        os.dup2(devnull, sys.stdout.fileno())
        sys.exit(1)  # Python Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ с ΠΊΠΎΠ΄ΠΎΠΌ ошибки 1 Π½Π° EPIPE

if __name__ == '__main__':
    main()

НС устанавливайтС для SIGPIPE Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ SIG_DFL, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ ошибки BrokenPipeError. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠΌΡƒ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡŽ вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΊΠΎΠ΅-Π»ΠΈΠ±ΠΎ соСдинСниС сокСта прСрываСтся, ΠΏΠΎΠΊΠ° ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° всС Π΅Ρ‰Π΅ ΠΏΠΈΡˆΠ΅Ρ‚ Π² Π½Π΅Π³ΠΎ.

Last updated

Was this helpful?