我的问题的本质是“用户程序如何在 Mac OS High Sierra 上打开 pty(例如 /dev/ptyp0)?”设备名称的标准 open() 似乎不起作用,尽管它的保护是 crw-rw-rw-。
上下文是在 Mac OS 下运行 Emacs。在 High Sierra 之前,当我命令 Emacs 创建一个包含子进程的 shell 窗口时,Emacs 分配了一个 pty 来与子进程通信。升级到 High Sierra 后,Emacs 无法再分配 pty,并使用管道与子进程通信。这使得子进程的行为不太像终端窗口中的 shell,这是一种较差的用户体验。
跟踪 Emacs 的操作表明,Emacs 正在尝试按顺序打开系统上定义的每个 pty,并且每次都会收到 errno 35。
我在网上找到了一篇文章,表明在 Mac OS High Sierra 上打开 pty 的方式与以前版本的 Mac OS 不同,但它没有提供详细信息。
答案的本质是类 Unix 系统上至少使用两种机制来分配 pty。 High Sierra 使用与以前的 Mac OS 版本不同的机制,其中显然涉及设备 /dev/ptmx,因此如果您的程序未使用正确的机制,它将失败。在 Emacs 的情况下,如果它无法分配 pty,它会回退到使用管道与子进程通信,该子进程不会“有 tty”,并且您不能在其上使用 tty 函数。
对于 Emacs,我使用的是 22.1.1 版本,该版本被配置为使用以前的 pty 机制(尝试按顺序打开每个 /dev/ptyXX)。使用版本 26.1 修复了该问题。您可以从以下位置下载作为 Mac 应用程序构建的 Emacs 26.1 版本:https://emacsformacosx.com https://emacsformacosx.com
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)