3 回答
TA貢獻1836條經驗 獲得超3個贊
目前,cgo編譯器無法處理ac函數中的變量參數和c頭文件中的宏,因此您無法做一個簡單的操作
// #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之以鼻。最好的選擇是用帶有特定數量參數的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 answer
func GetWinSz() {
var ts C.ttysize;
C.myioctl(0,TIOCGWINSZ,&ts)
}
我還沒有測試過,但是類似的東西應該可以工作。
TA貢獻1813條經驗 獲得超2個贊
最好的方法是使用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 {
$TIOCGWINSZ = TIOCGWINSZ
};
typedef winsize $winsize;
現在運行
godefs -gpackagename termios.c > termios.go
現在,您應該擁有了獲取終端大小所需的一切。設置大小就像向termios.c添加另一個常量一樣簡單。
- 3 回答
- 0 關注
- 336 瀏覽
添加回答
舉報
