Wykrywanie CTRL + C w Node.js


92

Otrzymałem ten kod z innego pytania SO, ale węzeł skarżył się, że używa process.stdin.setRawMode zamiast tty, więc go zmieniłem.

Przed:

var tty = require("tty");

process.openStdin().on("keypress", function(chunk, key) {
  if(key && key.name === "c" && key.ctrl) {
    console.log("bye bye");
    process.exit();
  }
});

tty.setRawMode(true);

Po:

process.stdin.setRawMode(true);
process.stdin.on("keypress", function(chunk, key) {
  if(key && key.name === "c" && key.ctrl) {
    console.log("bye bye");
    process.exit();
  }
});

W każdym razie jest to po prostu utworzenie całkowicie nieodpowiadającego procesu węzła, który nic nie robi, przy czym pierwszy narzeka tty, następnie zgłasza błąd, a drugi po prostu nic nie robi i wyłącza natywną CTRL+ Cobsługę Node , więc nawet nie opuszcza węzła, gdy ja naciśnij. Jak mogę pomyślnie obsługiwać Ctrl+ Cw systemie Windows ?

Odpowiedzi:


176

Jeśli próbujesz złapać sygnał przerwania SIGINT, nie musisz czytać z klawiatury. processPrzedmiotem nodejsnaraża przerwania imprezy:

process.on('SIGINT', function() {
    console.log("Caught interrupt signal");

    if (i_should_exit)
        process.exit();
});

Edycja : nie działa w systemie Windows bez obejścia. Spójrz tutaj


3
Tyle że tak nie jest. W najlepszym razie nie w oknach.
user3025492

1
Wygląda na to, że to już naprawione ... w 2012 roku. Github.com/joyent/node/issues/1553
Mason Wan

11
Dla przyszłych czytelników odpowiedź na to pytanie w przypadku systemu Windows jest dostępna tutaj: stackoverflow.com/a/14861513/2020425
Griffork

Działa jak magia. Powinna być zaakceptowana odpowiedź. Dzięki.
Lub Assayag

6

Dla potrzebujących funkcjonalności znalazłem śmierć (npm nodule, hah!) .

Autor twierdzi również , że działa w systemie Windows:

Został przetestowany tylko w systemach zgodnych z POSIX. Oto fajna dyskusja na temat sygnałów systemu Windows, najwyraźniej zostało to naprawione / zmapowane.

Mogę potwierdzić CTRL+ Cdziała na win32 (tak, jestem zaskoczony).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.