Linenoise: Ctrl-z (SIGSTOP) não é tratado corretamente.

Criado em 18 mai. 2017  ·  8Comentários  ·  Fonte: antirez/linenoise

Quando pressiono ctrl-z no terminal (enviando SIGSTOP), ele apenas coloca na linha de entrada. Não sei por que e como, mas o programa deve parar e retornar ao shell. Então, com o comando fg , devo poder voltar ao processo.

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

Comentários muito úteis

Há uma maneira muito simples de implementar a funcionalidade CTRL + Z, conforme mostrado por Steve Bennett em seu fork do linenoise: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

Eu adaptei o patch para que se aplique sobre o mestre atual (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) e este é o 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 comentários

como você faz seu prompt ficar assim 0,0

é peixe

@ krux02 Vejo que você está usando c ++, @yhirose tem um linenoise que foi portado para c ++: https://github.com/yhirose/cpp-linenoise. Também está habilitado para UTF8.

Você pode compartilhar uma essência do seu código linenoise_example?

Na verdade, não estou usando c ++. Eu costumava programar muito em C ++, mas agora faço Nim . Apenas para o exemplo, eu queria ter certeza de que meu problema não vem de nada relacionado ao Nim, então criei um projeto c ++.

Pela minha experiência, a API C está bem, não preciso de uma versão c ++. Além disso, não tive problemas para usar utf8 nesta biblioteca. O que estou perdendo são muitos comandos de teclado com os quais já estou muito familiarizado no readline.

Eu uso uma versão empacotada do linenoise, então não tenho certeza se realmente vale muito para você, mas este é o exemplo que eu uso e não é orientado para linenoise: https://github.com/krux02/opengl -sandbox / blob / master / examples / console.nim

A ideia nesse arquivo é usar o sistema macro do Nim para disponibilizar uma função arbitrária no interpretador de comandos. Mas, por baixo do capô, o interpretador de comandos é o ruído da linha.

@ krux02

Bem, profissionalmente sou agnóstico quanto ao idioma, mas, pessoalmente, também sou um C esnobe: blush: eu amo C.

Lembre-se, Linenoise é uma biblioteca básica, sem frescuras, que é um objetivo de design.

Eu quero olhar para isso, infelizmente não terei tempo até este fim de semana, deixe em aberto a menos que alguém resolva para você.

Ei! Você está na primeira página do Nim! Bom trabalho, Arne!

@ krux02

Ok, este projeto C mostra o comportamento que você está descrevendo:

https://github.com/Sonophoto/shellnoise

Ctrl-C e Ctrl-D, entretanto, se comportam normalmente.

Linenoise parece estar capturando o Ctrl-Z como entrada (e, neste exemplo, ele é simplesmente ecoado no terminal como uma string) em vez de passá-lo para o shell.

Ah, e observe que este projeto está usando entrada de linha múltipla de ruído de linha.

@ krux02

Meu melhor palpite, com um pouco de pesquisa, é que o ruído de linha coloca o terminal em modo bruto e essa configuração está fazendo com que ele capture Ctrl-Z como um caractere em vez de um código de controle ASCII.

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

e U + 001A É o código Ctrl-Z quando impresso em UTF8

@hoelzro veio com este patch, mas ele não controla o Ctrl-C corretamente. No entanto, isso também poderia ser capturado e simplesmente tratado com ruído de linha.

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

Há uma maneira muito simples de implementar a funcionalidade CTRL + Z, conforme mostrado por Steve Bennett em seu fork do linenoise: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

Eu adaptei o patch para que se aplique sobre o mestre atual (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422) e este é o 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);

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

denisvm picture denisvm  ·  9Comentários

ozancaglayan picture ozancaglayan  ·  21Comentários

ghost picture ghost  ·  4Comentários

fatcerberus picture fatcerberus  ·  5Comentários

JelteF picture JelteF  ·  8Comentários