我正在编写一个简单的应用程序来使用ptys并运行诸如vi之类的命令。当它们运行时,无论我的终端仿真器的大小如何,pty都在一个很小的窗口上运行。这是一个屏幕截图:https://imgur.com/a/DdRG2Ib光标位于pty之外(屏幕为空白,外面没有任何内容)。

为了使终端仿真器保持最大尺寸,我的目标是“扩展” pty的尺寸并使用全屏。

我的方法是获取stdout的大小,并将其设置为终端的主大小,方法如下:Can't change terminal size on pty/N (works on ttyN)

#define err(x) { if((x)==-1) exit(1); }
int set(int masterfd) {
    float k = 0;
    struct winsize w;
    err(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w));
    printf("wsz: r:%d c:%d\n", w.ws_row, w.ws_col);
    w.ws_row *= k; w.ws_col *= k;
    err(ioctl(masterfd, TIOCSWINSZ, &w));
    return 1;
}


k不为零时,整个屏幕会混乱。仅当行和列均为零时,终端才很小,但可以使用。

打开母版后,我希望通过母版fd调用set()来调整终端的大小。对printf()的调用显示,在STDOUT_FILENO上,行和列是我的显示大小,在主文件上,它们是0。

如何让pty使用全屏显示?

最佳答案

您的问题几乎肯定不是在您显示的代码中,而是在您没有的代码中。另外,您的问题尚不清楚,但我怀疑它不仅对k=0还是对所有带有k的非负k<=1都很好用。

大概您是将pty上运行的程序的输出传递到您的进程作为标准输出的终端,可以按原样或以某种方式进行修改。一般来说,这是行不通的。相反,您实际上必须模拟一个(某种特定类型的)终端,在内存中维护自己的逻辑终端内容,然后将其呈现给真实的终端,将其裁剪到要显示的区域。这是相当不平凡的。请注意,尽管screen至少可以执行此操作的有限形式,而无需编写任何新代码。

关于c - PTY以较小的尺寸运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57777418/

10-11 20:57