Linenoise: Ctrl-z (SIGSTOP) не обрабатывается должным образом.

Созданный на 18 мая 2017  ·  8Комментарии  ·  Источник: antirez/linenoise

Когда я нажимаю ctrl-z на терминале (отправляя SIGSTOP), он просто помещает в строку ввода. Не знаю, почему и как, но программа должна остановиться и вернуться в оболочку. Затем с помощью команды fg я смогу вернуться к процессу.

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

Самый полезный комментарий

Существует очень простой способ реализовать функциональность CTRL + Z, как показано Стивом Беннетом в его вилке Linenoise: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

Я адаптировал патч, чтобы он применялся поверх текущего мастера (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422), и вот результат:

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

Все 8 Комментарий

Как сделать так, чтобы ur подсказка выглядела так? 0.0

это рыба

@ krux02 Я вижу, вы используете C ++, у @yhirose есть бельевой шум, который был перенесен на C ++: https://github.com/yhirose/cpp-linenoise. Он также поддерживает UTF8.

Не могли бы вы поделиться сутью вашего кода бельеoise_example?

На самом деле я не использую c ++. Раньше я много программировал на C ++, но теперь я занимаюсь Nim . Просто в качестве примера я хотел убедиться, что моя проблема не связана с чем-то связанным с Nim, поэтому я создал проект на C ++.

По моему опыту, C API просто прекрасен, мне не нужна версия на C ++. Также у меня не возникло никаких проблем с использованием utf8 в этой библиотеке. Мне не хватает многих клавиатурных команд, с которыми я уже хорошо знаком в readline.

Я использую обернутую версию льняного шума, поэтому я не уверен, действительно ли он многого стоит для вас, но это тот пример, который я использую, и он не ориентирован на льняной шум: https://github.com/krux02/opengl -sandbox / blob / master / examples / console.nim

Идея в этом файле состоит в том, чтобы использовать макросистему Nim, чтобы сделать произвольную функцию доступной в интерпретаторе команд. Но под капотом командный интерпретатор бесшумный.

@ krux02

Ну, профессионально я языковой агностик, но лично я тоже сноб на Си: blush: Я люблю Си.

Помните, что Linenoise - это простая библиотека без излишеств, и это цель дизайна.

Я хочу разобраться в этом, к сожалению, у меня не будет времени до этих выходных, оставьте это открытым, если кто-то не решит это за вас.

Привет! Вы на главной странице Nim! Хорошая работа, Арне!

@ krux02

Хорошо, этот проект C показывает поведение, которое вы описываете:

https://github.com/Sonophoto/shellnoise

Однако Ctrl-C и Ctrl-D работают нормально.

Linenoise, кажется, захватывает Ctrl-Z в качестве ввода (и в этом примере он просто выводится на терминал в виде строки) вместо того, чтобы передавать его оболочке.

Да, и обратите внимание, что в этом проекте используется многострочный ввод с льняным шумом.

@ krux02

Мое лучшее предположение, немного покопавшись, заключается в том, что леншум переводит терминал в необработанный режим, и эта настройка заставляет его захватывать Ctrl-Z как символ, а не как управляющий код ASCII.

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

и U + 001A - это код Ctrl-Z при печати в UTF8

@hoelzro придумал этот патч, но он неправильно обрабатывает Ctrl-C. Однако это тоже можно было запечатлеть и просто обработать льняным шубом.

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

Существует очень простой способ реализовать функциональность CTRL + Z, как показано Стивом Беннетом в его вилке Linenoise: https://github.com/msteveb/linenoise/commit/29aedbd22b5e3529aff1f85ec1b3164118b83291

Я адаптировал патч, чтобы он применялся поверх текущего мастера (https://github.com/antirez/linenoise/commit/4a961c0108720741e2683868eb10495f015ee422), и вот результат:

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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

JelteF picture JelteF  ·  8Комментарии

denisvm picture denisvm  ·  9Комментарии

fatcerberus picture fatcerberus  ·  5Комментарии

ozancaglayan picture ozancaglayan  ·  21Комментарии

ghost picture ghost  ·  4Комментарии