suchen
HeimBackend-EntwicklungPython-TutorialPython verwendet das Signalmodul, um die geplante Ausführung zu implementieren

Wenn Sie im Liunx-System jede Minute einen Befehl ausführen möchten, ist Crontab die häufigste Methode. Wenn Sie Crontab nicht verwenden möchten, haben meine Kollegen darauf hingewiesen, dass Sie diese Funktion mit einem Timer implementieren können Im Programm, also begann ich zu erkunden, stellte ich fest, dass ich etwas Signalwissen benötige...

Überprüfen Sie, welche Signale Ihr Linux unterstützt: kill -l

root@server:~# kill -l

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
root@server:~#

Signal: Die Kommunikationsmethode zwischen Prozessen ist ein Software-Interrupt. Sobald ein Prozess ein Signal empfängt, unterbricht er den ursprünglichen Programmausführungsablauf, um das Signal zu verarbeiten. Das Betriebssystem legt das Standardverhalten des Prozesses nach dem Empfang des Signals fest. Wir können jedoch das Verhalten des Prozesses nach dem Empfang des Signals ändern, indem wir die Signalverarbeitungsfunktion binden. Es gibt zwei Signale, die nicht geändert werden können: SIGTOP und SIGKILL.

Es gibt im Allgemeinen zwei Gründe für das Senden von Signalen:

1 (passiv) Der Kernel erkennt ein Systemereignis. Wenn beispielsweise der untergeordnete Prozess beendet wird, sendet er das SIGCHLD-Signal an den übergeordneten Prozess Durch Drücken von Strg c auf der Tastatur wird ein SIGINT-Signal gesendet.

2 (aktiv) sendet ein Signal an den angegebenen Prozess über den Systemaufruf kill

Es gibt eine Setitimer-Funktion in der Sprache C Die Funktion setitimer kann drei voneinander unabhängige Timer bereitstellen. Bei jedem zeitgesteuerten Abschluss wird ein Zeitsignal an den Prozess gesendet und die Zeit automatisch neu eingestellt. Der Parameter, der den Typ des Timers bestimmt:

ITIMER_REAL Timing in Echtzeit, identisch mit dem Alarmtyp. SIGALRM

ITIMER_VIRT Die tatsächliche Ausführungszeit des geplanten Prozesses im Benutzermodus. SIGVTALRM

ITIMER_PROF Die tatsächliche Ausführungszeit des geplanten Prozesses im Benutzermodus und Kernmodus. SIGPROF

Diese drei Timer senden unterschiedliche Signale an den Prozess, wenn das Timing abgeschlossen ist. Darunter sendet der ITIMER_REAL-Klassen-Timer das SIGALRM-Signal, der ITIMER_VIRT-Klassen-Timer das SIGVTALRM-Signal und der ITIMER_REAL-Klassen-Timer SIGPROF-Signal.

Die Alarmfunktion stellt im Wesentlichen einen nicht überlasteten ITIMER_REAL-Timer mit geringer Genauigkeit ein. Er kann nur auf Sekunden genau sein und jede Einstellung kann nur einen Timer generieren. Die von der Funktion setitimer eingestellten Timer sind unterschiedlich. Sie können die Zeit nicht nur auf Mikrosekunden einstellen (theoretisch), sondern auch die Zeit automatisch ändern. In einem Unix-Prozess können Alarm- und ITIMER_REAL-Timer nicht gleichzeitig verwendet werden.

SIGINT Prozess beenden Prozess unterbrechen (Steuerung c)

SIGTERM Prozess beenden Software-Beendigungssignal

SIGKILL Prozess beenden Prozess beenden

SIGALRM Weckersignal

Die Vorkenntnisse sind fast fertig und es ist Zeit, sich mit dem Python-Signal zu befassen.

Signalnamen definieren

Das Signalpaket definiert jeden Signalnamen und seine entsprechende Ganzzahl, z. B.

import signal
print signal.SIGALRM
print signal.SIGCONT

Die von Python verwendeten Signalnamen sind die gleichen wie die von Linux. Sie können die

$man 7 signal
voreingestellte Signalverarbeitungsfunktion über

abfragen. Der Kern des Signalpakets besteht darin, die Funktion signal.signal() zum Voreinstellen (Registrieren) zu verwenden ) Signalverarbeitung Die Funktion lautet wie folgt:

singnal.signal(signalnum, handler)

signalnum ist ein Signal und handler ist die Verarbeitungsfunktion von das Signal. Wir haben in Signal Basics erwähnt, dass ein Prozess Signale ignorieren, Standardaktionen ausführen oder Aktionen anpassen kann. Wenn der Handler signal.SIG_IGN ist, wird das Signal ignoriert. Wenn der Handler singal.SIG_DFL ist, führt der Prozess die Standardaktion (Standard) aus. Wenn der Handler ein Funktionsname ist, führt der Prozess die in der Funktion definierte Aktion aus.

import signal
# Define signal handler function
def myHandler(signum, frame):
  print('I received: ', signum)
  
# register signal.SIGTSTP's handler 
signal.signal(signal.SIGTSTP, myHandler)
signal.pause()
print('End of Signal Demo')

Im Hauptprogramm verwenden wir zunächst die Funktion signal.signal(), um die Signalverarbeitungsfunktion voreinzustellen. Dann führen wir signal.pause() aus, um den Prozess anzuhalten und auf das Signal zu warten. Wenn das Signal SIGUSR1 an den Prozess übergeben wird, wird der Prozess aus der Pause fortgesetzt und führt die SIGTSTP-Signalverarbeitungsfunktion myHandler() gemäß der Standardeinstellung aus. Einer der beiden Parameter von myHandler wird verwendet, um das Signal zu identifizieren (Signum), und der andere wird verwendet, um den Status des Prozessstapels (Stack-Frame) zu erhalten, wenn das Signal auftritt. Beide Parameter werden von der Funktion signal.singnal() übergeben.

Das obige Programm kann in einer Datei (z. B. test.py) gespeichert werden. Wir verwenden zum Ausführen die folgende Methode:

$python test.py

, um den Prozess laufen zu lassen. Wenn das Programm signal.pause() erreicht, pausiert der Prozess und wartet auf das Signal. Senden Sie an dieser Stelle das SIGTSTP-Signal an den Prozess, indem Sie STRG Z drücken. Wir können sehen, dass der Prozess die Funktion myHandle() ausführt, dann zum Hauptprogramm zurückkehrt und die Ausführung fortsetzt. (Natürlich können Sie auch $ps verwenden, um die Prozess-ID abzufragen, und dann $kill verwenden, um ein Signal zu senden.)

(Der Prozess muss nicht signal.pause() verwenden, um anzuhalten und zu warten für das Signal kann es auch funktionieren. Signale empfangen in, zum Beispiel die obige signal.pause() in eine Schleife umwandeln, deren Arbeit lange dauert)

Wir können die Operationen in myHandler() ändern entsprechend unseren Bedürfnissen, um unterschiedliche Signale zu implementieren.

SIGALRM-Signal regelmäßig senden

Eine nützliche Funktion ist signal.alarm(), die verwendet wird, um nach einer bestimmten Zeit ein SIGALRM-Signal an den Prozess selbst zu senden:

import signal
# Define signal handler function
def myHandler(signum, frame):
  print("Now, it's the time")
  exit()
  
# register signal.SIGALRM's handler 
signal.signal(signal.SIGALRM, myHandler)
signal.alarm(5)
while True:
  print('not yet')

我们这里用了一个无限循环以便让进程持续运行。在signal.alarm()执行5秒之后,进程将向自己发出SIGALRM信号,随后,信号处理函数myHandler开始执行。 

发送信号

signal包的核心是设置信号处理函数。除了signal.alarm()向自身发送信号之外,并没有其他发送信号的功能。但在os包中,有类似于linux的kill命令的函数,分别为  

os.kill(pid, sid)
os.killpg(pgid, sid)

分别向进程和进程组(见Linux进程关系)发送信号。sid为信号所对应的整数或者singal.SIG*。

实际上signal, pause,kill和alarm都是Linux应用编程中常见的C库函数,在这里,我们只不过是用Python语言来实现了一下。实际上,Python 的解释器是使用C语言来编写的,所以有此相似性也并不意外。此外,在Python 3.4中,signal包被增强,信号阻塞等功能被加入到该包中。我们暂时不深入到该包中。

Stellungnahme
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal?Wie löste ich das Problem der Berechtigungen beim Betrachten der Python -Version in Linux Terminal?Apr 01, 2025 pm 05:09 PM

Lösung für Erlaubnisprobleme beim Betrachten der Python -Version in Linux Terminal Wenn Sie versuchen, die Python -Version in Linux Terminal anzuzeigen, geben Sie Python ein ...

Wie benutze ich eine schöne Suppe, um HTML zu analysieren?Wie benutze ich eine schöne Suppe, um HTML zu analysieren?Mar 10, 2025 pm 06:54 PM

In diesem Artikel wird erklärt, wie man schöne Suppe, eine Python -Bibliothek, verwendet, um HTML zu analysieren. Es beschreibt gemeinsame Methoden wie find (), find_all (), select () und get_text () für die Datenextraktion, die Behandlung verschiedener HTML -Strukturen und -Anternativen (SEL)

Wie führe ich ein tiefes Lernen mit Tensorflow oder Pytorch durch?Wie führe ich ein tiefes Lernen mit Tensorflow oder Pytorch durch?Mar 10, 2025 pm 06:52 PM

Dieser Artikel vergleicht TensorFlow und Pytorch für Deep Learning. Es beschreibt die beteiligten Schritte: Datenvorbereitung, Modellbildung, Schulung, Bewertung und Bereitstellung. Wichtige Unterschiede zwischen den Frameworks, insbesondere bezüglich des rechnerischen Graps

Wie kann ich die gesamte Spalte eines Datenrahmens effizient in einen anderen Datenrahmen mit verschiedenen Strukturen in Python kopieren?Wie kann ich die gesamte Spalte eines Datenrahmens effizient in einen anderen Datenrahmen mit verschiedenen Strukturen in Python kopieren?Apr 01, 2025 pm 11:15 PM

Bei der Verwendung von Pythons Pandas -Bibliothek ist das Kopieren von ganzen Spalten zwischen zwei Datenrahmen mit unterschiedlichen Strukturen ein häufiges Problem. Angenommen, wir haben zwei Daten ...

Wie erstelle ich Befehlszeilenschnittstellen (CLIS) mit Python?Wie erstelle ich Befehlszeilenschnittstellen (CLIS) mit Python?Mar 10, 2025 pm 06:48 PM

Dieser Artikel führt die Python-Entwickler in den Bauen von CLIS-Zeilen-Schnittstellen (CLIS). Es werden mit Bibliotheken wie Typer, Click und ArgParse beschrieben, die Eingabe-/Ausgabemedelung betonen und benutzerfreundliche Designmuster für eine verbesserte CLI-Usabilität fördern.

Was sind einige beliebte Python -Bibliotheken und ihre Verwendung?Was sind einige beliebte Python -Bibliotheken und ihre Verwendung?Mar 21, 2025 pm 06:46 PM

In dem Artikel werden beliebte Python-Bibliotheken wie Numpy, Pandas, Matplotlib, Scikit-Learn, TensorFlow, Django, Flask und Anfragen erörtert, die ihre Verwendung in wissenschaftlichen Computing, Datenanalyse, Visualisierung, maschinellem Lernen, Webentwicklung und h beschreiben

Erklären Sie den Zweck virtueller Umgebungen in Python.Erklären Sie den Zweck virtueller Umgebungen in Python.Mar 19, 2025 pm 02:27 PM

Der Artikel erörtert die Rolle virtueller Umgebungen in Python und konzentriert sich auf die Verwaltung von Projektabhängigkeiten und die Vermeidung von Konflikten. Es beschreibt ihre Erstellung, Aktivierung und Vorteile bei der Verbesserung des Projektmanagements und zur Verringerung der Abhängigkeitsprobleme.

Was sind reguläre Ausdrücke?Was sind reguläre Ausdrücke?Mar 20, 2025 pm 06:25 PM

Regelmäßige Ausdrücke sind leistungsstarke Tools für Musteranpassung und Textmanipulation in der Programmierung, wodurch die Effizienz bei der Textverarbeitung in verschiedenen Anwendungen verbessert wird.

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

Sicherer Prüfungsbrowser

Sicherer Prüfungsbrowser

Safe Exam Browser ist eine sichere Browserumgebung für die sichere Teilnahme an Online-Prüfungen. Diese Software verwandelt jeden Computer in einen sicheren Arbeitsplatz. Es kontrolliert den Zugriff auf alle Dienstprogramme und verhindert, dass Schüler nicht autorisierte Ressourcen nutzen.

WebStorm-Mac-Version

WebStorm-Mac-Version

Nützliche JavaScript-Entwicklungstools

SecLists

SecLists

SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.