Signal von kill abfangen (SIGTERM)

In dieser Linux-Ecke dürfen nur Themen rund um Linux geschrieben werden.
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Velz
Beiträge: 180
Registriert: 18.10.2004 22:20

Signal von kill abfangen (SIGTERM)

Beitrag von Velz »

Hat jemand eine Idee wie man ein Signal von Kill kontrolliert abfängt um Dateien zu schließen und Speicher zu bereinigen????

Im Besonderen SIGTERM und SIGKILL??
Zuletzt geändert von Velz am 14.11.2009 13:30, insgesamt 1-mal geändert.
Win10/64|Ubuntu-Server|Mint WS // Programmiere Datenbankanwendungen und Tools mit PB-5.x und MySQL-5.x unter Win und Linux
Velz
Beiträge: 180
Registriert: 18.10.2004 22:20

Re: kill abfangen

Beitrag von Velz »

ok... wer lesen kann ist im Vorteil... und da war doch mal etwas in C...

Mit einem Beispiel aus dem englischen Forum habe ich es zum laufen gebracht. Ich stelle die Lösung mal ein, evtl. kanns jemand brauchen.

Es gieng um die Frage, wie ich ein Programm beim Runterfahren oder auch über den Befehl "kill" ordentlich beenden kann. D.h. ich möchte Zeit haben die Dateien zu schließen und den Speicher zu bereinigen.

Hier das Beispiel (weitgehend aus dem englischen Forum):

Code: Alles auswählen

; demo for the use of *nix signals from within PB
; can be used in GUI applications too
; 2007 walker
;-------------------------------------------------
#SIGHUP       = 1
#SIGINT       = 2
#SIGQUIT   =   3
#SIGILL      = 4
#SIGTRAP   =   5
#SIGABRT   =   6
#SIGBUS      = 7
#SIGFPE       =   8
#SIGKILL       =   9
#SIGUSR1   =   10
#SIGSEGV   =   11
#SIGUSR2   =   12
#SIGPIPE       =   13
#SIGALRM   =   14
#SIGTERM   =   15
#SIGSTKFLT   = 16
#SIGCHLD   =   17
#SIGCONT   =   18
#SIGSTOP   =   19
#SIGTSTP      = 20
#SIGTTIN      = 21
#SIGTTOU   =   22
#SIGURG      = 23
#SIGXCPU   =   24
#SIGXFSZ   =   25
#SIGVTALRM=   26
#SIGPROF   =   27
#SIGWINCH   = 28
#SIGIO      = 29
#SIGPWR   =   30
#SIGSYS      =  31

ProcedureC on_killed_do(signum)
   PrintN("Speicher aufräumen")
   PrintN("Datei schließen")
   PrintN(Str(signum))
   End
EndProcedure

signal_(#SIGINT,@on_killed_do())
signal_(#SIGQUIT,@on_killed_do())
signal_(#SIGTERM,@on_killed_do())


Repeat
Delay(2000)
PrintN("Warte auf Signal" )
ForEver
Jetzt kann ich mit "ps -C PROGRAMMNAME" den Prozess und damit die PID suchen und mit "kill PID" den Prozess beenden. Kill sendet primär das Signal 15 SIGTERM. Das Signal wird abgefangen und die Prozedur ausgeführt. SIGKILL kann nicht abgefangen werden.

Das gute ist, es funktioniert auch wenn das Programm in einem Delay() steht und man sonst keine Möglichkeit hat an das Programm ran zu kommen.
Win10/64|Ubuntu-Server|Mint WS // Programmiere Datenbankanwendungen und Tools mit PB-5.x und MySQL-5.x unter Win und Linux
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Re: Signal von kill abfangen (SIGTERM)

Beitrag von funk.munich »

Hi zusammen,

gibt es hierfür unter Windows ein vergleichbaren Code? Wenn ich diesen Code unter Windows versuche
auszuführen erscheint die Fehlermeldung "signal_() is not a function, array, macro or linked list."

Danke + Gruß,
Daniel
melow
Beiträge: 32
Registriert: 04.02.2006 05:05
Wohnort: Thailand

Re: Signal von kill abfangen (SIGTERM)

Beitrag von melow »

Hallo Alle

Bräuchte auch obigen Code für Windows.

Kann mir evntl. jemand dabei weiterhelfen?

Danke.

lg
Melow :-)
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Signal von kill abfangen (SIGTERM)

Beitrag von Bisonte »

Ich weiss zwar nicht genau, was mit dem Kill gemeint ist, aber ich kann mir vorstellen, dass damit das
herunterfahren gemeint ist.

Das Signal was Windows beim runterfahren sendet ist in einem WindowCallback mit
#WM_QUERYENDSESSION
abfragbar. zu finden unter https://msdn.microsoft.com/de-de/librar ... s.85).aspx

Ansonsten gab es hier im Forum (ich glaube von TS-Soft) ein Beispiel dafür...

__________________________________________________
URL-Tags hinzugefügt
30.01.2017
RSBasic
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
melow
Beiträge: 32
Registriert: 04.02.2006 05:05
Wohnort: Thailand

Re: Signal von kill abfangen (SIGTERM)

Beitrag von melow »

Danke für Deine Antwort.


Das Besipiel mit #WM_QUERYENDSESSION hatte ich gesehen... allerdings hat mein exe Prozess weder ein Fenster und noch nicht einmal eine Console (ist ein reiner standalone Daemon)... hab gesehen daß #WM_QUERYENDSESSION nur mit mindestens einem Fenster funktioniert.

Müsste quasi das "Prozess Beenden" Signal oder Event abfangen - und noch kurz aufräumarbeiten erledigen - bevor der Prozess endgültig vom OS beendet wird...

Was tun?

lg Melow
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Signal von kill abfangen (SIGTERM)

Beitrag von Bisonte »

Ein unsichtbares Fenster.... !
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
DarkDragon
Beiträge: 6267
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Signal von kill abfangen (SIGTERM)

Beitrag von DarkDragon »

Bisonte hat geschrieben:Ich weiss zwar nicht genau, was mit dem Kill gemeint ist, aber ich kann mir vorstellen, dass damit das
herunterfahren gemeint ist.
Das ist das einfache Abwürgen eines Prozesses (Strg + C in der Konsole z.B.) und hat nichts mit herunterfahren zu tun. Man will quasi vor dem Abwürgen noch etwas bereinigen oder ähnliches. Hier eine genauere Beschreibung:
http://www.gnu.org/software/libc/manual ... gnals.html

[EDIT]

Das hier dürfte nützlich sein:
https://msdn.microsoft.com/en-us/librar ... h09_topic3

[EDIT]

Soweit ich weiß gibt es allerdings keine derartigen Signale unter Windows und man muss u.U. viele verschiedene Techniken anwenden, je nach dem was man erreichen will. Das hier z.B. fängt Strg+C ab, aber kein Schließen durch den TaskManager o.ä.:https://msdn.microsoft.com/en-us/librar ... 2147217396
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten