如何在Linux中使用C语言伪终端?

16

我正在尝试弄清如何在Linux中使用伪终端,本质上我想创建一个telnetd克隆,这是我在早期问题中提到的。

我理解主从终端的概念,并且对如何在C中使用系统调用有基本的了解。

我的问题涉及在打开从属/主文件描述符后下一步怎么办。我该如何在从属中启动getty?是否有任何关于使用forkpty()、openpty()或其他API的好资源在网络上?

一些C语言示例会有所帮助。这是一个非常类似的问题,但没有人真正提供任何示例。

3个回答

13

《Unix环境高级编程》第二版中有一章非常出色的内容,介绍了Linux中可用的伪终端层。最好的部分是源代码,其中包含一个pty驱动程序,并清晰地演示了如何使用pty接口。(如果您想以编程方式驱动仅限于终端的程序但不想使用expect(1),则构建的pty程序本身也很有用。)


@JérémyPouyet,感谢您的提醒;我已经修复了链接,指向第二版代码(这是我熟悉的代码)--也许第三版会是更好的选择,但我还没有亲自阅读过那个版本的代码。总有一天。 :) - sarnold
是的,这也是我发现的。如果开放的话,也许我会给作者发电子邮件,这必须发送到GitHub :-) - Ciro Santilli OurBigBook.com
kerrisk的Linux编程接口也有一章关于此主题:https://github.com/cirosantilli/linux-programming-interface-kerrisk/tree/c02ede2d146e0529f3b01d513a4d3894a1761f08/pty - Ciro Santilli OurBigBook.com

5

包含

#include <sys/stat.h>

#include <fcntl.h>

#define _XOPEN_SOURCE

#include <stdlib.h>

int main(int argc, char **argv) 
{
char *slavename;
int masterfd;
masterfd = open("/dev/ptmx", O_RDWR);
grantpt(masterfd);
unlockpt(masterfd);
slavename = ptsname(masterfd);
...
}

我发布了一个简单的示例,演示了伪终端主从概念。请查看以下链接,以清楚理解Linux中的终端:http://www.linusakesson.net/programming/tty/


这是简单明了的答案。文档在这里:http://linux.die.net/man/4/ptmx - EdH

0

你不需要为 ptys 启动 getty。getty 只是该过程的“监听器”部分。对于硬连线终端,每个单独的终端设备都在不断地“监听”。对于 telnet,守护进程在套接字上执行监听部分,并通过创建 pty 对并 fork() / exec() 处理连接请求。

而且:APUE 很好地处理了 ptys。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接