Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
虚拟终端中的Ncurses程序_C_Linux - Fatal编程技术网

虚拟终端中的Ncurses程序

虚拟终端中的Ncurses程序,c,linux,C,Linux,为了继续理解伪终端是如何工作的,我编写了一个小程序来运行bash 问题是,我的断线好像断了。(仅当我按enter键后,才会出现外壳提示。) 此外,我仍然不能正确地使用ncurses程序,比如vi。有人能告诉我如何为此设置伪终端吗 。操作系统是GNU/Linux,谢谢 编辑:像这样编译:gcc program.c-lutil-o program 再次编辑:看起来奇怪间距的问题是由于使用printf()造成的,但仍然无法解决ncurses程序的问题。您的程序中存在多个问题。有些相对容易修复,有些则不

为了继续理解伪终端是如何工作的,我编写了一个小程序来运行bash

问题是,我的断线好像断了。(仅当我按enter键后,才会出现外壳提示。)

此外,我仍然不能正确地使用ncurses程序,比如vi。有人能告诉我如何为此设置伪终端吗

。操作系统是GNU/Linux,谢谢

编辑:像这样编译:gcc program.c-lutil-o program


再次编辑:看起来奇怪间距的问题是由于使用printf()造成的,但仍然无法解决ncurses程序的问题。

您的程序中存在多个问题。有些相对容易修复,有些则不那么容易:

  • 它的朋友来自BSD,并且与POSIX不兼容。在新的项目中应该避免使用它们。从:

    从历史上看,有两种伪终端API已经发展:BSD和System V。SUSv1标准化了基于System V API的伪终端API,并且该API应该应用于所有使用伪终端的新程序中

    你应该改用。这个问题可能并不重要,但您应该意识到这一点

  • 您正在混合调用原始系统调用(,)和文件流(,)函数。这是一个很好的迷惑自己的方法。一般来说,你应该选择一种方法并坚持下去。在这种情况下,最好使用低级系统调用(,),以避免由于存在C库函数使用的I/O缓冲区而产生的任何问题

  • 通过使用和,您正在为您的终端假设一个基于线的范例。这并不总是正确的,尤其是在处理交互式程序(如
    vim
    )时

  • 您假设的是C风格的单字节空终止字符串范例。终端通常处理字符和字节,而不是字符串。虽然大多数字符集编码都避免使用零字节,但并非所有字符集编码都这样做

  • 由于上述(2)、(3)和(4)的原因,您没有正确地使用。您应该使用它们的返回值来确定它们处理了多少字节,而不是像这样基于字符串的函数

  • 在我看来,这是一个最难解决的问题:你含蓄地假设:

    • 终端(或其驱动程序)是无状态的:不是。时期我怀疑至少有两个有状态控件是基于ncurses的程序无法正常工作的原因:和终端的。至少这些必须在父/主终端和从终端之间匹配,以避免各种奇怪的伪影

    • 终端的控制接口可以通过来回传递字节来传递:情况并非总是如此。现代虚拟终端允许通过调用进行一定程度的带外控制,如Linux所述

    处理此问题的最简单方法可能是将父终端设置为原始模式,并让从属伪终端驱动程序处理棘手的细节


  • 你可能想看看哪个似乎很好用。它来自这本书,完整的源代码是。免责声明:我没有读过这本书,也没有推广这本书-我只是在谷歌上找到了这个程序。

    如果你还没有,注册一个免费的github/bitbucket帐户,可能会重复。将源代码保存在存储库中,并获得免费共享、差异、历史记录等。TLPI由Michael Kerrisk编写,他在维护Linux手册页方面做得非常出色。