Bir ctrl-c olayını nasıl yakalayabilirim?


133

C ++ 'da bir Ctrl+ Colayını nasıl yakalarım ?


Konsol uygulaması, Windows uygulaması veya ne?
GManNickG

7
Hangi işletim sistemi Windows, Linux vb.
shf301

1
Bu bir Qt uygulaması, ancak geliştirme sırasında konsoldan çalıştırıyorum. (Bu Linux)
Scott

Yanıtlar:


172

signaluygulamalarda farklılık gösterdiği için en güvenilir yol değildir. Kullanmanızı tavsiye ederim sigaction. Tom'un kodu artık şöyle görünecektir:

#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

void my_handler(int s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{

   struct sigaction sigIntHandler;

   sigIntHandler.sa_handler = my_handler;
   sigemptyset(&sigIntHandler.sa_mask);
   sigIntHandler.sa_flags = 0;

   sigaction(SIGINT, &sigIntHandler, NULL);

   pause();

   return 0;    
}

1
Bence my_handler int sargüman olarak almalı . sig_tkendisi bir işlev gösterici türüdür.
Matthew Marshall

38
<stdlib.h> vb. - bu C, C ++ değil. C ++ 'da <
cstdlib

8
printf()eşzamansız sinyal güvenli değildir, bu nedenle sinyal işleyici içinde kullanılamaz.
PP

7
Bu işlevler Windows'ta mevcut değildir.
Timmmm

2
sa_maskve hakkında biraz açıklama yapmak güzel olurdu sa_flags.
2018


40

SIGINT sinyalini yakalamalısınız (POSIX değil mi?)

@Gab Royer´ın önem için cevabına bakın.

Misal:

#include <signal.h>
#include <stdlib.h>
#include <stdio.h>

void my_handler(sig_t s){
           printf("Caught signal %d\n",s);
           exit(1); 

}

int main(int argc,char** argv)
{
   signal (SIGINT,my_handler);

   while(1);
   return 0;

}

Evet, POSIX. Soruya Linux eklemeyi unuttum.
Scott

2
signal (), BSD veya SysV stilini takip etmesine bağlı olarak farklı davranır. sigaction () tercih edilir.
asveikau

2
Eski olduğunu biliyorum, ancak bu g ++ (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1) 7.4.0'da derlenmiyor. Ben değiştirmek zorunda void my_handler(sig_t s)için void my_handler(sig_atomic_t s).
jcmonteiro

1

Evet, bu platforma bağlı bir sorudur.

POSIX üzerinde bir konsol programı yazıyorsanız, sinyal API ( #include <signal.h>) kullanın.

Bir WIN32 GUI uygulamasında WM_KEYDOWNmesajı işlemelisiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.