Linenoise: Ctrl-z (SIGSTOP) no se maneja correctamente.

Creado en 18 may. 2017  ·  8Comentarios  ·  Fuente: antirez/linenoise

Cuando presiono ctrl-z en la terminal (enviando SIGSTOP), simplemente coloca un en la línea de entrada. No sé por qué ni cómo, pero se supone que el programa se detiene y vuelve al shell. Luego, con el comando fg debería poder volver al proceso.

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

Comentario más útil

Hay una forma muy simple de implementar la funcionalidad CTRL + Z, como lo muestra Steve Bennett en su bifurcación de linenoise: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

He adaptado el parche para que se aplique sobre el maestro actual (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) y este es el resultado:

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

Todos 8 comentarios

¿Cómo haces que tu mensaje se vea así? 0.0

es pescado

@ krux02 Veo que estás usando c ++, @yhirose tiene una linenoise que se ha portado a c ++: https://github.com/yhirose/cpp-linenoise. También está habilitado para UTF8.

¿Puedes compartir un resumen de tu código linenoise_example?

En realidad, no estoy usando c ++. Solía ​​programar mucho en C ++ pero ahora hago Nim . Solo por ejemplo, quería asegurarme de que mi problema no provenga de nada relacionado con Nim, así que creé un proyecto en c ++.

Desde mi experiencia, la API de C está bien, no necesito una versión de C ++. Además, no tuve ningún problema para usar utf8 en esta biblioteca. Lo que me equivoco son muchos comandos de teclado con los que ya estoy muy familiarizado en readline.

Utilizo una versión envuelta de linenoise, así que no estoy tan seguro de si realmente vale mucho para ti, pero este es el ejemplo que utilizo y no está orientado a linenoise: https://github.com/krux02/opengl -sandbox / blob / master / examples / console.nim

La idea en ese archivo es usar el sistema de macros de Nim para hacer que una función arbitraria esté disponible en el intérprete de comandos. Pero bajo el capó, el intérprete de comandos es linenoise.

@ krux02

Bueno, soy agnóstico del lenguaje profesionalmente, pero personalmente también soy un snob de C: rubor: me encanta C.

Recuerde, Linenoise es una biblioteca básica, sin lujos, que es un objetivo de diseño.

Quiero investigar esto, desafortunadamente no tendré tiempo hasta este fin de semana, déjelo abierto a menos que alguien lo resuelva por usted.

¡Oye! ¡Estás en la portada de Nim! ¡Buen trabajo Arne!

@ krux02

Ok, este proyecto de C muestra el comportamiento que está describiendo:

https://github.com/Sonophoto/shellnoise

Ctrl-C y Ctrl-D, sin embargo, se comportan normalmente.

Linenoise parece estar capturando Ctrl-Z como entrada (y en este ejemplo simplemente se repite en el terminal como una cadena) en lugar de pasarlo al shell.

Ah, y tenga en cuenta que este proyecto utiliza una entrada multilínea de linenoise.

@ krux02

Mi mejor suposición con un poco de investigación es que linenoise pone el terminal en un modo sin formato y esa configuración hace que capture Ctrl-Z como un carácter en lugar de como un código de control ASCII.

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

y U + 001A ES el código Ctrl-Z cuando se imprime en UTF8

@hoelzro creó este parche pero no maneja el Ctrl-C correctamente. Sin embargo, eso también podría capturarse y manejarse simplemente en linenoise.

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

Hay una forma muy simple de implementar la funcionalidad CTRL + Z, como lo muestra Steve Bennett en su bifurcación de linenoise: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

He adaptado el parche para que se aplique sobre el maestro actual (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) y este es el resultado:

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

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

fatcerberus picture fatcerberus  ·  5Comentarios

ozancaglayan picture ozancaglayan  ·  21Comentarios

denisvm picture denisvm  ·  9Comentarios

ghost picture ghost  ·  4Comentarios

JelteF picture JelteF  ·  8Comentarios