Linenoise: Ctrl-z(SIGSTOP)が正しく処理されません。

作成日 2017年05月18日  ·  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機能を実装する非常に簡単な方法があります//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件

プロンプトを0.0のようにするにはどうすればよいですか

:@ krux02@yhiroseていhttps://github.com/yhirose/cpp-linenoiseを。 UTF8も有効になっています。

linenoise_exampleコードの要点を共有できますか?

実際、私はc ++を使用していません。 以前は多くのC ++をプログラムしていましたが、現在はNimを使用しています。 例として、問題がNimに関連するものに起因しないことを確認したかったので、c ++プロジェクトを作成しました。

私の経験から、C APIは問題なく、C ++バージョンは必要ありません。 また、このライブラリでutf8を使用してもまったく問題はありませんでした。 私が見逃しているのは、readlineですでによく知っている多くのキーボードコマンドです。

私はラップされたバージョンのlinenoiseを使用しているので、それが本当にあなたにとって多くの価値があるかどうかはわかりませんが、これは私が使用する例であり、linenoise指向ではありません: https

そのファイルのアイデアは、Nimのマクロシステムを使用して、コマンドインタープリターで任意の関数を使用できるようにすることです。 しかし、内部では、コマンドインタープリターはラインノイズです。

@ krux02

ええと、私は専門的には言語にとらわれませんが、個人的にはCのスノッブでもあります:blush:私はCが大好きです。

Linenoiseは必要最低限​​のものであり、飾り気のないライブラリではなく、設計目標であることを忘れないでください。

残念ながら、これを調べたいのですが、今週末まで時間がありません。誰かが解決しない限り、これを開いたままにしておきます。

おい! あなたはニムのトップページにいます! グッドジョブアルネ!

@ krux02

わかりました。このCプロジェクトは、あなたが説明している動作を示しています。

https://github.com/Sonophoto/shellnoise

ただし、Ctrl-CおよびCtrl-Dは正常に動作します。

Linenoiseは、Ctrl-Zをシェルに渡すのではなく、入力としてキャプチャしているように見えます(この例では、単に文字列として端末にエコーされます)。

ああ、このプロジェクトはラインノイズマルチライン入力を使用していることに注意してください。

@ krux02

少し掘り下げてみると、ラインノイズによって端末がrawモードになり、セットアップによってCtrl-ZがASCII制御コードではなく文字としてキャプチャされるようになっていると思います。

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

U + 001Aは、UTF8で印刷された場合のCtrl-Zコードです。

@hoelzroはこのパッチを思いついたが、Ctrl-Cを正しく処理しない。 ただし、それもキャプチャして、ラインノイズで簡単に処理できます。

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

スティーブ・ベネットがラインノイズのフォークで示したように、CTRL + Z機能を実装する非常に簡単な方法があります//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 評価

関連する問題

ozancaglayan picture ozancaglayan  ·  21コメント

JelteF picture JelteF  ·  8コメント

denisvm picture denisvm  ·  9コメント

fatcerberus picture fatcerberus  ·  5コメント

ghost picture ghost  ·  4コメント