您如何在Go中获得终端大小?

如何在Go中获取终端大小。在C中,它看起来像这样:


struct ttysize ts; 

ioctl(0, TIOCGWINSZ, &ts);

但是我如何在Go中访问TIOCGWINSZ


红糖糍粑
浏览 274回答 3
3回答

米脂

目前,cgo编译器无法处理ac函数中的变量参数和c头文件中的宏,因此您无法做一个简单的操作// #include <sys/ioctl.h>// typedef struct ttysize ttysize;import "C"func GetWinSz() {&nbsp; &nbsp; var ts C.ttysize;&nbsp; &nbsp; C.ioctl(0,C.TIOCGWINSZ,&ts)}为了避开宏,请使用常量,因此// #include <sys/ioctl.h>// typedef struct ttysize ttysize;import "C"const TIOCGWINSZ C.ulong = 0x5413; // Value from Jed Smith's answerfunc GetWinSz() {&nbsp; &nbsp; var ts C.ttysize;&nbsp; &nbsp; C.ioctl(0,TIOCGWINSZ,&ts)}但是,cgo仍然会在ioctl的原型中bar之以鼻。最好的选择是用带有特定数量参数的ac函数包装ioctl并将其链接。作为hack,您可以在上面的注释中导入“ C”// #include <sys/ioctl.h>// typedef struct ttysize ttysize;// void myioctl(int i, unsigned long l, ttysize * t){ioctl(i,l,t);}import "C"const TIOCGWINSZ C.ulong = 0x5413; // Value from Jed Smith's answerfunc GetWinSz() {&nbsp; &nbsp; var ts C.ttysize;&nbsp; &nbsp; C.myioctl(0,TIOCGWINSZ,&ts)}我还没有测试过,但是类似的东西应该可以工作。

慕姐8265434

最好的方法是使用syscall程序包。syscall包未定义ioctl函数,因为它只做了很多不同的事情,但是您仍然可以像这样调用它:syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), uintptr(TIOCGWINSZ), uintptr(unsafe.Pointer(&ts)))剩下的两件事是复制winsize结构和所需的常数。用于此目的的工具是godefs,它将通过查看C头文件中的结构和常量来生成.go源文件。创建一个如下所示的termios.c文件:#include <termios.h>enum {&nbsp; &nbsp; $TIOCGWINSZ = TIOCGWINSZ};typedef winsize $winsize;现在运行godefs -gpackagename termios.c > termios.go现在,您应该拥有了获取终端大小所需的一切。设置大小就像向termios.c添加另一个常量一样简单。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go