Linenoise: Ctrl-z (SIGSTOP) n'est pas géré correctement.

Créé le 18 mai 2017  ·  8Commentaires  ·  Source: antirez/linenoise

Lorsque j'appuie sur ctrl-z sur le terminal (envoyant SIGSTOP), il met simplement un sur la ligne d'entrée. Je ne sais pas pourquoi et comment, mais le programme est censé s'arrêter et revenir au shell. Ensuite, avec la commande fg je devrais pouvoir revenir au processus.

┬─[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

Commentaire le plus utile

Il existe un moyen très simple d'implémenter la fonctionnalité CTRL+Z, comme le montre Steve Bennett dans son fork de linoise : https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

J'ai adapté le patch pour qu'il s'applique au dessus du master actuel (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) et voici le résultat :

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);

Tous les 8 commentaires

comment faire pour que votre invite ressemble à ça 0.0

c'est du poisson

@krux02 Je vois que vous utilisez c++, @yhirose a une linoise qui a été portée en c++ : https://github.com/yhirose/cpp-linenoise. Il est également compatible UTF8.

Pouvez-vous partager un aperçu de votre code linoise_example ?

En fait, je n'utilise pas c++. J'avais l'habitude de programmer beaucoup de C++ mais maintenant je fais Nim . Juste pour l'exemple, je voulais m'assurer que mon problème ne venait pas de quoi que ce soit en rapport avec Nim, j'ai donc créé un projet c++.

D'après mon expérience, l'API C est très bien, je n'ai pas besoin d'une version c++. De plus, je n'ai eu aucun problème à utiliser utf8 dans cette bibliothèque. Ce qui me manque, ce sont de nombreuses commandes clavier que je connais déjà très bien sur readline.

J'utilise une version emballée de linoise, donc je ne suis pas sûr que ça vaut vraiment beaucoup pour vous, mais c'est l'exemple que j'utilise et il n'est pas orienté linoise : https://github.com/krux02/opengl -sandbox/blob/master/examples/console.nim

L'idée dans ce fichier consiste à utiliser le système de macros de Nim pour rendre une fonction arbitraire disponible dans l'interpréteur de commandes. Mais sous le capot l'interpréteur de commandes est linoise.

@krux02

Eh bien, je suis agnostique du langage professionnellement mais personnellement, je suis aussi un snob du C :blush: J'aime le C.

N'oubliez pas que Linenoise est une bibliothèque simple, sans fioritures, c'est un objectif de conception.

Je veux étudier cela, malheureusement, je n'aurai pas le temps avant ce week-end, laissez-le ouvert à moins que quelqu'un ne le résolve pour vous.

Hey! Vous êtes à la une de Nim ! Bon travail Arne !

@krux02

Ok, ce projet C montre le comportement que vous décrivez :

https://github.com/Sonophoto/shellnoise

Ctrl-C et Ctrl-D se comportent cependant normalement.

Linenoise semble capturer le Ctrl-Z en entrée (et dans cet exemple, il est simplement renvoyé sur le terminal sous forme de chaîne) au lieu de le transmettre au shell.

Oh et notez que ce projet utilise une entrée multiligne linoise.

@krux02

Ma meilleure supposition avec un peu de creusement est que la linoise met le terminal dans un mode brut et cette configuration l'amène à capturer le Ctrl-Z en tant que caractère au lieu d'un code de contrôle ASCII.

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

et U+001A EST le code Ctrl-Z lorsqu'il est imprimé en UTF8

@hoelzro a proposé ce correctif mais il ne gère pas correctement Ctrl-C. Cependant, cela pourrait également être capturé et simplement traité dans la linoise.

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

Il existe un moyen très simple d'implémenter la fonctionnalité CTRL+Z, comme le montre Steve Bennett dans son fork de linoise : https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

J'ai adapté le patch pour qu'il s'applique au dessus du master actuel (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) et voici le résultat :

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);

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

ozancaglayan picture ozancaglayan  ·  21Commentaires

ghost picture ghost  ·  4Commentaires

denisvm picture denisvm  ·  9Commentaires

fatcerberus picture fatcerberus  ·  5Commentaires

JelteF picture JelteF  ·  8Commentaires