【问题标题】:C Fork a new ttyC fork 一个新的 tty
【发布时间】:2012-02-20 15:29:41
【问题描述】:

我必须在不使用 forkpty() 的情况下创建一对新的 tty(主从)。

在 pts(4) 的 man 中写道:

当一个进程打开 /dev/ptmx 时,它会获得一个伪终端主 (PTM) 的文件描述符,并在 /dev/pts 目录中创建一个伪终端从 (PTS) 设备。

使用 C 中的一个小程序,我可以这样打开 /dev/ptmx:

open("/dev/ptmx", O_RDWR);

但是 /dev/pts/ 中没有创建新的 pty。

【问题讨论】:

  • 为什么不使用 forkpty() ?这是家庭作业吗?
  • 请接受您之前问题的一些答案(假设您认为它们有帮助)。

标签: c file-io tty pty


【解决方案1】:

这是一个很好的主题教程:Using pseudo-terminals to control interactive programs, pty, pdip。如果此链接以错误 403 结尾,这是另一个:http://rkoucha.fr/tech_corner/pty_pdip.html

特别是查看页面中间的示例源代码,标题为“通过伪终端进行进程间通信”。这是一个进程自身 fork 的示例,然后两个进程通过父进程先前打开的 PTY 相互通信。

【讨论】:

【解决方案2】:

要实际创建一个可用的 pty 对,您还必须在 open 调用返回的 fd 上调用 grantpt(3) 和 unlockpt(3)。它没有明确定义在该进程中文件系统中实际从 pty 文件节点的创建位置——一些系统(通常 /dev/pts 是特殊文件系统的系统)将在打开时创建它,而其他系统将创建它作为 grantpt 或 unlockpt 调用的一部分。它也不能保证从服务器将在 /dev/pts 中——它可能在其他地方——所以你需要调用 ptsname(3) 来找出它在哪里。

调用 posix_openpt(3) 也可能比直接打开更便携。

【讨论】:

  • 确实,posix_openpt 是可移植的(/dev/ps/ptmx 是特定于 Linux 的,我知道它没有附加价值)。指令顺序是:用posix_openpt创建一个master,然后用grantpt授予对它的访问权限,给它master作为参数,然后用unlockpt解锁配对,然后获取slave的文件名以便稍后打开它用ptsname,然后用通常的open打开ptsname返回的文件名;一切都在 POSIX 1 中描述。
  • 这里有更多words from POSIX about ptmx:“标准开发人员考虑添加一个用于克隆主伪终端的特殊设备:/dev/ptmx 设备。然而,未能达成共识,人们认为添加新功能将允许其他实现。”还要注意他们是如何考虑/dev/ptmx 而不是Linux /dev/ps/ptmx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
相关资源
最近更新 更多