lyd*_*ric 6 terminal system-calls go stty
这是如何通过 go 中的系统调用获取 (POSIX) 终端大小的方法:
func getTermDim() (width, height int, err error) {
var termDim [4]uint16
if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(0), uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(&termDim)), 0, 0, 0); err != 0 {
return -1, -1, err
}
return int(termDim[1]), int(termDim[0]), nil
}
Run Code Online (Sandbox Code Playgroud)
现在,同样的事情,用 os/exec 调用 stty:
func getTermDim() (width, height int, err error) {
cmd := exec.Command("stty", "size")
cmd.Stdin = os.Stdin
var termDim []byte
if termDim, err = cmd.Output(); err != nil {
return
}
fmt.Sscan(string(termDim), &height, &width)
return
}
Run Code Online (Sandbox Code Playgroud)
在实践中,当必须将终端置于原始模式、设置选项等时,第一个解决方案可能会变得相当繁重且不可读。当人们习惯于 stty(例如在 shell 脚本中)时,第二个解决方案要容易得多!
所以我的问题是:使用第一个解决方案有什么好处?是速度?难道我们不能依赖stty命令安装在主机上吗?还有什么我想不到的吗?
简而言之,使用 stty 与系统调用的“风险”或“成本”是什么?