【问题标题】:termios default for standard terminal session标准终端会话的 termios 默认值
【发布时间】:2013-05-27 23:49:45
【问题描述】:

我想在 Linux 中创建一个新的 pty 会话,就像 gnome-terminal xterm 和其他人一样。我的一半任务正在工作,我用 openpty 创建了一个 pty 会话,fork() 一个进程,子进程使用从 FD,其余进程终端连接到网络套接字。

通过网络我可以连接到“远程终端”,但它不能正常工作。没有回声,按下回车后不发送字符(所以我无法在 nano、mc 等中导航)。

termios 结构体设置为cfmakeraw(struct termios)

问题:什么是默认会话中的默认 termios 设置,如 gnome-terminal 和其他。

【问题讨论】:

    标签: debian terminal c


    【解决方案1】:

    NULL 作为struct termios * 参数传递给openpty()(或forkpty(),您应该研究一下!),生成的默认值对于交互式终端来说应该是合理的。

    【讨论】:

    • 真正的问题是:网络套接字缓冲数据直到行尾字符,ech 也有效,但仅在行发送后才回显。但这是设置终端最简单的方法,谢谢:)
    • 这实际上并没有回答我想知道的问题 - gnome-terminal 等使用的实际默认值是什么,它是如何确定的?另外,如果我通过NULL,它如何确定使用哪些设置?
    • @tom 将struct termios * 参数作为NULL 传递使用在创建终端时由内核设置的默认值。 glibc 中的相关代码实际上就是if (termp) tcsetattr(slave, TCSAFLUSH, termp);
    • 好的,谢谢——我找到了sys/ttydefaults.h,默认值是如何编译到内核中的?我仍然想知道gnome-terminal 和其他终端应用程序,它们实际上是通过NULL 来传递这个参数还是设置了自己的设置?
    【解决方案2】:

    如果您的标准输入、标准输出或标准错误将发送到您的终端并且是正常的,您可以使用 tcgetattr()tcsetattr() 将设置从终端复制到您的 pty。

    struct termios ttyset;
    
    if (tcgetattr(FILE_STDERR, &ttyset) != 0)
        ...handle error - maybe try stdout or stdin...
    if (tcsetattr(pty_fd, TCSANOW, &ttyset) != 0)
        ...handle error...
    

    基本上,这假设您有一组良好的终端设置开始并将设置从FILE_STDERR 复制到pty_fd(假设是伪tty 从端的文件描述符)。

    当然,您可以在使用它们初始化伪 tty 之前相当长的时间捕获这些设置,即使它们在上面的代码片段中显示为相邻的操作。

    【讨论】:

    • 这也是一个很好的解决方案,复制工作热源的设置:struct termios def; memset(&def,0,sizeof(termios)); tcgetattr(2, &def); for(int i=0;i(((unsigned int)&def)+i)
    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2010-11-10
    • 2017-11-10
    • 1970-01-01
    • 2013-08-05
    相关资源
    最近更新 更多