3 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
目前,cgo編譯器無法處理ac函數(shù)中的變量參數(shù)和c頭文件中的宏,因此您無法做一個(gè)簡單的操作
// #include <sys/ioctl.h>
// typedef struct ttysize ttysize;
import "C"
func GetWinSz() {
var ts C.ttysize;
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 answer
func GetWinSz() {
var ts C.ttysize;
C.ioctl(0,TIOCGWINSZ,&ts)
}
但是,cgo仍然會在ioctl的原型中bar之以鼻。最好的選擇是用帶有特定數(shù)量參數(shù)的ac函數(shù)包裝ioctl并將其鏈接。作為hack,您可以在上面的注釋中導(dǎo)入“ 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 answer
func GetWinSz() {
var ts C.ttysize;
C.myioctl(0,TIOCGWINSZ,&ts)
}
我還沒有測試過,但是類似的東西應(yīng)該可以工作。

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊
最好的方法是使用syscall程序包。syscall包未定義ioctl函數(shù),因?yàn)樗蛔隽撕芏嗖煌氖虑椋悄匀豢梢韵襁@樣調(diào)用它:
syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), uintptr(TIOCGWINSZ), uintptr(unsafe.Pointer(&ts)))
剩下的兩件事是復(fù)制winsize結(jié)構(gòu)和所需的常數(shù)。用于此目的的工具是godefs,它將通過查看C頭文件中的結(jié)構(gòu)和常量來生成.go源文件。創(chuàng)建一個(gè)如下所示的termios.c文件:
#include <termios.h>
enum {
$TIOCGWINSZ = TIOCGWINSZ
};
typedef winsize $winsize;
現(xiàn)在運(yùn)行
godefs -gpackagename termios.c > termios.go
現(xiàn)在,您應(yīng)該擁有了獲取終端大小所需的一切。設(shè)置大小就像向termios.c添加另一個(gè)常量一樣簡單。
- 3 回答
- 0 關(guān)注
- 318 瀏覽