Seite 1 von 1

Bei Consolenprogramm schliessen verhindern

Verfasst: 01.04.2019 17:16
von stevie1401
Ich habe ein Consolenprogramm geschrieben, muss aber leider feststellen, dass sich die Console bei strg+c schliesst.
Kann ich das irgendwie verhindern?
(Windows+Linux)

Re: Bei Consolenprogramm schliessen verhindern

Verfasst: 01.04.2019 17:45
von Kiffi
Wenn Dein Konsolenprogramm nur Ausgaben macht:

Mein Tipp wäre, eine Art "Shell" mit PB zu erstellen, mit der Du Dein Konsolenprogramm mittels RunProgram() aufrufst und dessen Ausgabe über ReadProgramString() in einem Fenster ausgeben lässt.

Dürfte sowohl für Windows als auch für Linux die einfachste Möglichkeit sein.

Re: Bei Consolenprogramm schliessen verhindern

Verfasst: 01.04.2019 18:07
von stevie1401
Alles klar, vielen Dank!

Re: Bei Consolenprogramm schliessen verhindern

Verfasst: 01.04.2019 18:11
von NicTheQuick
Ich hab mir das grad mal angeschaut und einen C-Code übersetzt. Unter Linux kann man das SIGINT-Signal, das durch STRG+C ausgelöst wird, ganz einfach abfangen:

Code: Alles auswählen

Procedure term(signum.l)
	PrintN("Got signal " + signum)
EndProcedure

Structure sigaction
	*sa_handler
	*sa_sigaction
	sa_mask.l
	sa_flags.l
	*sa_restorer
EndStructure

Define action.sigaction

action\sa_handler = @term()

OpenConsole()

sigaction_(2, action, #Null)

Repeat
	Print("What do you want? ")
Until Input() = "exit"


CloseConsole()
Mit "exit" kann man das Programm beenden, mit STRG+C geht es nicht.

Man kann auch jedes andere Signal als nur SIGINT=2 abfangen. Die Liste kriegt man im Terminal mit "kill -l" und sieht so aus:

Code: Alles auswählen

 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	

Re: Bei Consolenprogramm schliessen verhindern

Verfasst: 19.09.2020 17:34
von tft
Hallo,

es ist sicher schon mehr als ein Jahr her. Aber es würde mich interesieren wie der Code funktionieren soll?

Code: Alles auswählen

Procedure term(signum.l)
   PrintN("Got signal " + signum)
EndProcedure

Structure sigaction
   *sa_handler
   *sa_sigaction
   sa_mask.l
   sa_flags.l
   *sa_restorer
EndStructure

Define action.sigaction

action\sa_handler = @term()

OpenConsole()

sigaction_(2, action, #Null)

Repeat
   Print("What do you want? ")
Until Input() = "exit"


CloseConsole()
den sigaction_(2, action, #Null) ist keine Funktion ... zumindestens nicht bei PB 5.72. Jemand ne Idee

Gruss TFT

Re: Bei Consolenprogramm schliessen verhindern

Verfasst: 19.09.2020 19:11
von mk-soft
Funktioniert unter Linux und macOS ...

So nicht unter Windows

Re: Bei Consolenprogramm schliessen verhindern

Verfasst: 19.09.2020 20:03
von mk-soft
Ich weiss nicht warum man bei windows das Signal wieder setzen muss.
Wenn man es nicht macht, führt es beim zweiten zum Ende.

Code: Alles auswählen

;-TOP

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  Import ""
    signal(a, callback)
  EndImport
CompilerEndIf

Structure sigaction
   *sa_handler
   *sa_sigaction
   sa_mask.l
   sa_flags.l
   *sa_restorer
EndStructure

; ----

Procedure term(signum.i)
  PrintN("Got signal " + signum)
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    signal(2, @term())
  CompilerEndIf
EndProcedure

OpenConsole()

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  signal(2, @term())
CompilerElse
  Define action.sigaction
  action\sa_handler = @term()
  sigaction_(2, action, #Null)
CompilerEndIf
Repeat
   Print("What do you want? ")
Until Input() = "exit"

CloseConsole()

Re: Bei Consolenprogramm schliessen verhindern

Verfasst: 20.09.2020 16:28
von tft
sorry ... bei mir .... W10 mit PB 5.72 lässt sich der Close Bitton bei der Console nicht umgehen .....

Weiter Ideen ?

Gruss TFT