Toon posts:

[c] process netjes beeindigen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een c programma dat alle handlers uit signal.h (vc6 versie) opvangt. Alleen als ik de aplicatie met kill.exe afsluit, dan wordt geen enkele handler gebruikt. Hoe kan ik er voor zorgen dat het programma toch veilig afgesloten wordt? Bv als ik een file open heb, dat ik nog de kans heb om hem af te flushen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <signal.h>

int running = 1;

int handler( int signal, char* kind ) {
  printf("Ending %s....\n", kind);
  running = FALSE;
  return 0;
} 

int handlerInt(int signal)
{
  return handler(signal, "Int");
}

// andere handlers

int dummy()
{
  while(running)
      Sleep(1000);
  return 0;
}

int main(int argc, char* argv[])
{
   int status = 0;
   printf("START killtest\n");
   signal( SIGINT, handlerInt );
   signal( SIGTERM, handlerTerm );
   signal( SIGABRT, handlerAbrt );
   signal( SIGFPE, handlerFpe );
   signal( SIGILL, handlerIll );
   signal( SIGSEGV, handlerSegv );
   dummy();
   return status;
}

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 19-05 21:26

MBV

misschien na die while running neerzetten? Zo werkt dat iig met java threads, weet niet hoe dat zit met een SIGKILL

Verwijderd

Topicstarter
De functie handler( int signal, char* kind ) wordt op het moment niet uitgevoerd, dus ik neem aan dat hij nooit na while(running) komt.

Verwijderd

Ben je zeker dat kill.exe een SIGTERM stuurt? Ik mis namelijk nog wat signals in die lijst (SIGKILL en SIGSTOP bvb). En als ik dan even 'man signal' op m'n linux bakkie doe krijg ik:
Using a signal handler function for a signal is called "catching the signal". The signals SIGKILL and SIGSTOP cannot be caught or ignored.
Aangezien je vc6 zegt neem ik aan dat je op Windows zit. Ik weet niet hoe dat precies op Windows zit, maar misschien is het wel gelijkaardig en stuurt die kill een SIGKILL die je niet kunt opvangen? Ik weet dat 'kill' op linux default een SIGTERM stuurt, maar misschien dat dat op Windows anders is?
Ik gok maar wat hoor :)

[edit]
Owja, afgezien daarvan lijkt het me in orde wat je doet. Als je OS je proces echt met brute force gaat afschieten is er weinig wat je kunt doen lijkt me :P

[ Voor 18% gewijzigd door Verwijderd op 29-10-2004 16:10 ]


  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Probeer je app eens af te sluiten met CTRL-C.

This can no longer be ignored.


Verwijderd

Topicstarter
Met met ctrl+c afsluiten werkt gewoon goed, dus ik vrees idd dat Kill.exe iets te grof is in het afsluiten.
Als ik met perl probeer netjes mijn programma af te sluiten:
code:
1
Win32::Process::KillProcess($_, 2)

Dan gaat het niet goed (geen output met "Ending..."), als ik zelf met ctrl+c afsluit gaat het dus wel goed.

Verwijderd

MSDN signal():
The SIGILL, SIGSEGV, and SIGTERM signals are not generated under Windows NT. They are included for ANSI compatibility. Thus you can set signal handlers for these signals with signal, and you can also explicitly generate these signals by calling raise.
Mij lijkt atexit() cq. _onexit() dus meer geschikt.

Verwijderd

Topicstarter
_onexit() / atexit() werken ook niet. Die functies worden blijkbaar niet meer aangeroepen om het moment dat het programma SIGKILL/SIGSTOP ontvangt.

  • igmar
  • Registratie: April 2000
  • Laatst online: 12-05 15:46

igmar

ISO20022

Verwijderd schreef op 01 november 2004 @ 09:12:
_onexit() / atexit() werken ook niet. Die functies worden blijkbaar niet meer aangeroepen om het moment dat het programma SIGKILL/SIGSTOP ontvangt.
SIGSTOP beeindigd je proces niet, maar zet 'm alleen stil. Tegen een SIGKILL is inderdaad niets te doen, maar ik vraag me verder af hoe compliant de POSIX signals in NT zijn.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

kill.exe roept TerminateProcess aan en genereert dus nooit een shutdown signal.

Professionele website nodig?


Verwijderd

Topicstarter
Is er een andere manier (desnoods met een eigen programma) om een process af te schieten met een zelf the kiezen shutdown signal? Op msdn kom ik alleen terminateprocess en exitprocess tegen..

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
WM_EXIT ?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Kijk eens naar [rml]curry684 in "[ Delphi]Opgestarte programma afsluiten"[/rml] :)

dat verdient overigens een nominatie voor meest gelinkte post in P&W ;)

Professionele website nodig?


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Verwijderd schreef op 01 november 2004 @ 10:11:
Is er een andere manier (desnoods met een eigen programma) om een process af te schieten met een zelf the kiezen shutdown signal? Op msdn kom ik alleen terminateprocess en exitprocess tegen..
GenerateConsoleCtrlEvent is denk ik de functie die het dichtst in de buurt komt. Ik was hier ooit ook naar op zoek.

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 16-05 11:22
curry684 schreef op 01 november 2004 @ 10:32:
Kijk eens naar [rml]curry684 in "[ Delphi]Opgestarte programma afsluiten"[/rml] :)

dat verdient overigens een nominatie voor meest gelinkte post in P&W ;)
Wat een supernette code, curry684!
Alleen mist er nog een accolade-sluiten (en 3 #include's bovenaan).

[ Voor 8% gewijzigd door riezebosch op 01-11-2004 11:51 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1