Go语言Mac系统下unix.TCGETS等效用法 终端回显控制代码编译报错解决
macOS 终端回显控制的等效实现
你在Linux下使用的代码存在非标准写法,且macOS的系统调用约束更严格,所以无法编译通过。两类系统的核心termios操作逻辑一致,仅入参规则有差异,以下是可在macOS下正常编译运行的实现方案:
import ( "os" "golang.org/x/sys/unix" ) // 关闭终端回显 func disableEcho() (*unix.Termios, error) { fd := int(os.Stdin.Fd()) term, err := unix.IoctlGetTermios(fd, unix.TCGETS) if err != nil { return nil, err } newTerm := *term newTerm.Lflag &^= unix.ECHO err = unix.IoctlSetTermios(fd, unix.TCSETS, &newTerm) if err != nil { return nil, err } return term, nil } // 恢复终端回显 func restoreEcho(oldTerm *unix.Termios) error { fd := int(os.Stdin.Fd()) return unix.IoctlSetTermios(fd, unix.TCSETS, oldTerm) }
核心修改说明:
- 统一使用标准输入的文件描述符
int(os.Stdin.Fd())作为ioctl调用的第一个参数,丢弃Linux下支持的直接传unix.Stdout的非标准写法,macOS不兼容该写法。 - 回显位的操作逻辑和Linux完全一致,都是修改termios结构Lflag字段的
ECHO标志位。 - 该写法同时兼容Linux和macOS双平台,不需要额外做条件编译。
内容的提问来源于stack exchange,提问作者daisy
相关产品推荐
相关产品推荐

