Bei Consolenprogramm schliessen verhindern

Anfängerfragen zum Programmieren mit PureBasic.
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Bei Consolenprogramm schliessen verhindern

Beitrag 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)
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Bei Consolenprogramm schliessen verhindern

Beitrag 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.
Hygge
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Bei Consolenprogramm schliessen verhindern

Beitrag von stevie1401 »

Alles klar, vielen Dank!
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Bei Consolenprogramm schliessen verhindern

Beitrag 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	
Bild
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Bei Consolenprogramm schliessen verhindern

Beitrag 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
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Bei Consolenprogramm schliessen verhindern

Beitrag von mk-soft »

Funktioniert unter Linux und macOS ...

So nicht unter Windows
Zuletzt geändert von mk-soft am 19.09.2020 20:03, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Bei Consolenprogramm schliessen verhindern

Beitrag 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()
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
tft
Beiträge: 605
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Bei Consolenprogramm schliessen verhindern

Beitrag 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
TFT seid 1989 , Turgut Frank Temucin , Dachsen/Berlin/Antalya
Aktuelles Projekte : Driving School Evergarden
YouTube : Pure Basic to go
FaceBook : Temuçin SourceMAgic Games
DISCORD : SourceMagic
W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Antworten