我正在试图弄清楚如何在linux中使用伪终端,基本上我想创建一个telnetd克隆,我提到in an earlier question。
我理解主终端的概念,我对如何在C中使用系统调用有了基本的把握。
我的问题涉及打开slave / master文件描述符后的下一步。如何在奴隶中推出getty?网上是否有使用forkpty(),openpty()或其他API的良好的资源?
C中的一些例子会有所帮助。 This was a very similar question,但没有人真正提供任何示例。
答案 0 :(得分:10)
Advanced Programming in the Unix Environment, 2nd Edition有一个关于Linux中可用的伪终端层的精湛篇章。最好的部分是source code,其中包含pty
驱动程序,并且非常清楚地演示了如何使用pty
接口。 (如果您想以编程方式驱动仅限终端的程序但不希望使用pty
,则它构建的expect(1)
程序本身就很有用。)
答案 1 :(得分:4)
#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/ 强>
答案 2 :(得分:0)
对于ptys,你没有 lauch a getty 。 getty只是该过程的“倾听者”部分。对于硬连线终端,每个终端设备都在不断“收听”。对于telnet,守护进程执行侦听部分(在套接字上),并通过创建 pty对和fork()ing / exec()来处理连接请求。 事实上:APUE很好地处理了ptys。