Linenoise: Strg-z (SIGSTOP) wird nicht richtig gehandhabt.

Erstellt am 18. Mai 2017  ·  8Kommentare  ·  Quelle: antirez/linenoise

Wenn ich ctrl-z am Terminal drücke (SIGSTOP sende), wird nur ein in die Eingabezeile geschrieben. Ich weiß nicht warum und wie, aber das Programm soll anhalten und zur Shell zurückkehren. Dann sollte ich mit dem Befehl fg in der Lage sein, zum Prozess zurückzukehren.

┬─[arne@arne-thinkpad:~/proj/c++/linenoise]─[18:05:53]
╰─>$ ./linenoise_example 
hello> foo
echo: 'foo'
hello> 
echo: ''
hello> 

┬─[arne@arne-thinkpad:~/proj/c++/linenoise]─[18:05:54]
╰─>$ python
Python 3.6.1 (default, Mar 27 2017, 00:27:06) 
[GCC 6.3.1 20170306] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> foo = 17
'python' has gestoppt

┬─[arne@arne-thinkpad:~/proj/c++/linenoise]─[18:06:07]
│ 1 28968   0%  gestoppt    python
╰─>$ fg
Job 1, 'python' in den Vordergrund schicken

>>> print(foo)
17

Hilfreichster Kommentar

Es gibt eine sehr einfache Möglichkeit, die STRG+Z-Funktionalität zu implementieren, wie von Steve Bennett in seiner Leinoise-Fork gezeigt: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

Ich habe den Patch so angepasst, dass er über dem aktuellen Master gilt (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) und das ist das Ergebnis:

commit d9400774549967cda04cfa04f56ed956cd79147c
Author: Steve Bennett <[email protected]>
Date:   Mon Jan 1 13:11:16 2018 +1000

    Enable ^Z (SUSP) support

    Allows the current process to be backgrounded and then resumed.

    Signed-off-by: Steve Bennett <[email protected]>

    (adaptations)

    Signed-off-by: Alexander F. Mayer <[email protected]>

diff --git a/linenoise.c b/linenoise.c
index 10ffd71..d861505 100644
--- a/linenoise.c
+++ b/linenoise.c
@@ -109,6 +109,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <string.h>
+#include <signal.h>
 #include <stdlib.h>
 #include <ctype.h>
 #include <sys/stat.h>
@@ -168,6 +169,7 @@ enum KEY_ACTION{
    CTRL_T = 20,        /* Ctrl-t */
    CTRL_U = 21,        /* Ctrl+u */
    CTRL_W = 23,        /* Ctrl+w */
+   CTRL_Z = 26,        /* Ctrl+z */
    ESC = 27,           /* Escape */
    BACKSPACE =  127    /* Backspace */
 };
@@ -830,6 +832,16 @@ static int linenoiseEdit(int stdin_fd, int stdout_fd, char *buf, size_t buflen,
         case CTRL_C:     /* ctrl-c */
             errno = EAGAIN;
             return -1;
+        case CTRL_Z:     /* ctrl-z */
+#ifdef SIGTSTP
+            /* send ourselves SIGSUSP */
+            disableRawMode(STDIN_FILENO);
+            raise(SIGTSTP);
+            /* and resume */
+            enableRawMode(STDIN_FILENO);
+            refreshLine(&l);
+#endif
+            continue;
         case BACKSPACE:   /* backspace */
         case 8:     /* ctrl-h */
             linenoiseEditBackspace(&l);

Alle 8 Kommentare

wie lässt sich deine Eingabeaufforderung so aussehen 0.0

es ist fisch

@krux02 Wie ich sehe, verwenden Sie c++, @yhirose hat ein Linenoise, das auf c++ portiert wurde: https://github.com/yhirose/cpp-linenoise. Es ist auch UTF8-fähig.

Können Sie uns einen Überblick über Ihren lineoise_example-Code geben?

Eigentlich verwende ich kein c++. Früher habe ich viel C++ programmiert, aber jetzt mache ich Nim . Nur für das Beispiel wollte ich sicherstellen, dass mein Problem nicht von irgendetwas mit Nim zu tun hat, also habe ich ein C++-Projekt erstellt.

Aus meiner Erfahrung ist die C-API in Ordnung, ich brauche keine C++-Version. Auch hatte ich überhaupt keine Probleme, utf8 in dieser Bibliothek zu verwenden. Was mir fehlt, sind viele Tastaturbefehle, die ich von readline bereits sehr gut kenne.

Ich verwende eine gewickelte Version von Leinoise, daher bin ich mir nicht sicher, ob es für Sie wirklich viel wert ist, aber dies ist das Beispiel, das ich verwende und es ist nicht an Leinen orientiert: https://github.com/krux02/opengl -sandbox/blob/master/examples/console.nim

Die Idee in dieser Datei besteht darin, das Makrosystem von Nim zu verwenden, um eine beliebige Funktion im Befehlsinterpreter verfügbar zu machen. Aber unter der Haube ist der Befehlsdolmetscher Leinenrausch.

@krux02

Nun, ich bin beruflich sprachagnostisch, aber persönlich bin ich auch ein C-Snob :blush: Ich liebe C.

Denken Sie daran, Linenoise ist eine reine Bibliothek ohne Schnickschnack, das ist ein Designziel.

Ich möchte das prüfen, leider habe ich bis zum Wochenende keine Zeit, lass das offen, es sei denn, jemand löst es für dich.

Hallo! Sie sind auf der Titelseite von Nim! Gute Arbeit Arne!

@krux02

Ok, dieses C-Projekt zeigt das von Ihnen beschriebene Verhalten:

https://github.com/Sonophoto/shellnoise

Strg-C und Strg-D verhalten sich jedoch normal.

Linenoise scheint Strg-Z als Eingabe zu erfassen (und in diesem Beispiel wird es einfach als Zeichenfolge an das Terminal ausgegeben), anstatt es an die Shell weiterzugeben.

Oh, und beachten Sie, dass dieses Projekt einen mehrzeiligen Linenoise-Eingang verwendet.

@krux02

Meine beste Vermutung mit ein wenig Graben ist, dass Linenoise das Terminal in einen Rohmodus versetzt und dieses Setup dazu führt, dass Strg-Z als Zeichen statt als ASCII-Steuercode erfasst wird.

https://github.com/antirez/linenoise/blob/master/linenoise.c#L217 -L251

und U+001A IST der Strg-Z-Code beim Drucken in UTF8

@hoelzro hat diesen Patch entwickelt, aber er behandelt Strg-C nicht richtig. Aber auch das ließe sich einfangen und einfach in Leinoise handhaben.

https://github.com/hoelzro/p6-linenoise/commit/7d0bb83cab34ca58f7a487b5df30736d058112cf

Es gibt eine sehr einfache Möglichkeit, die STRG+Z-Funktionalität zu implementieren, wie von Steve Bennett in seiner Leinoise-Fork gezeigt: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

Ich habe den Patch so angepasst, dass er über dem aktuellen Master gilt (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) und das ist das Ergebnis:

commit d9400774549967cda04cfa04f56ed956cd79147c
Author: Steve Bennett <[email protected]>
Date:   Mon Jan 1 13:11:16 2018 +1000

    Enable ^Z (SUSP) support

    Allows the current process to be backgrounded and then resumed.

    Signed-off-by: Steve Bennett <[email protected]>

    (adaptations)

    Signed-off-by: Alexander F. Mayer <[email protected]>

diff --git a/linenoise.c b/linenoise.c
index 10ffd71..d861505 100644
--- a/linenoise.c
+++ b/linenoise.c
@@ -109,6 +109,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <string.h>
+#include <signal.h>
 #include <stdlib.h>
 #include <ctype.h>
 #include <sys/stat.h>
@@ -168,6 +169,7 @@ enum KEY_ACTION{
    CTRL_T = 20,        /* Ctrl-t */
    CTRL_U = 21,        /* Ctrl+u */
    CTRL_W = 23,        /* Ctrl+w */
+   CTRL_Z = 26,        /* Ctrl+z */
    ESC = 27,           /* Escape */
    BACKSPACE =  127    /* Backspace */
 };
@@ -830,6 +832,16 @@ static int linenoiseEdit(int stdin_fd, int stdout_fd, char *buf, size_t buflen,
         case CTRL_C:     /* ctrl-c */
             errno = EAGAIN;
             return -1;
+        case CTRL_Z:     /* ctrl-z */
+#ifdef SIGTSTP
+            /* send ourselves SIGSUSP */
+            disableRawMode(STDIN_FILENO);
+            raise(SIGTSTP);
+            /* and resume */
+            enableRawMode(STDIN_FILENO);
+            refreshLine(&l);
+#endif
+            continue;
         case BACKSPACE:   /* backspace */
         case 8:     /* ctrl-h */
             linenoiseEditBackspace(&l);

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

denisvm picture denisvm  ·  9Kommentare

fatcerberus picture fatcerberus  ·  5Kommentare

JelteF picture JelteF  ·  8Kommentare

ghost picture ghost  ·  4Kommentare

ozancaglayan picture ozancaglayan  ·  21Kommentare