首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字的pty功能

套接字的pty功能
EN

Stack Overflow用户
提问于 2012-08-19 13:03:31
回答 3查看 1.5K关注 0票数 3

我正在编写linux守护进程,我希望实现通过telnet配置其params的能力。我有一个cli接口代码,它使用带有历史和完成器的gnu读行库编写,我想将该接口代码用于守护进程。

我试图将stdin/stdout重定向到套接字,将rl_instream/rl_outstream重定向到套接字,将读/写重定向到主/从pty,但没有成功。

在此提出的类似问题没有任何答案。

也读过这个问题,但我没有子进程。

我的问题是:

  1. 如何在单个进程中使用pty功能?
  2. 如果我只有一个进程,我需要使用主从pty吗?

代码示例(不对pty设备进行操作),预期的结果读行正常工作。

代码语言:javascript
复制
char* readline_buff;

int main(void){
int mSock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
int socketfd, n, flag = 1;

int addrlen;
daemon(1,1);
setsockopt(mSock, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(int));
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(5000);
addr.sin_addr.s_addr = INADDR_ANY;
bind(mSock, (const sockaddr*)&addr, sizeof(addr));
listen(mSock,SOMAXCONN);
addrlen = sizeof(addrlen);
bzero(&addr, sizeof(addr));

int m_pty = posix_openpt(O_RDWR);
grantpt(m_pty);
unlockpt(m_pty);
string m_ptsname = ptsname(m_pty);
int slave = open(m_ptsname.c_str(), O_RDWR);
//
socketfd = accept(mSock, (struct sockaddr *) &addr, (socklen_t*)&addrlen);
//
close(STDOUT_FILENO);
dup2(socketfd, STDOUT_FILENO);
close(STDIN_FILENO);
dup2(socketfd, STDIN_FILENO);
close(STDERR_FILENO);
dup2(socketfd, STDERR_FILENO);
//
 while(true){   
  readline_buff = readline("ME: ");
  add_history(readline_buff);
  free(readline_buff);
}
return 0;
}

非常感谢。

EN

回答 3

Stack Overflow用户

发布于 2012-08-19 16:16:38

telnet协议基本上是一个基于行的协议,因此它不容易处理单个按键或特殊代码。您可以要求连接的telnet客户端发送每个密钥而不是行,这是通过所谓的telnet协商来完成的。

要了解这方面的更多信息,您应该阅读telnet,最重要的是RFC 854RFC 855。要禁用客户端编辑,还应该阅读RFC 1116。还可以检查维基百科页面以查看所有与telnet相关的RFC的列表。

简而言之,您必须向客户端发送一系列命令,以要求它停止行模式处理,并希望客户端回答它将停止执行该操作。这不是简单的东西,实际上正好相反。但是,要实现完整的telnet状态机可以。即使这样,您也可能无法正确使用读行库,因为击键可能无法识别为正确的上/下键,而且您可能需要做一些翻译。实际上,我建议您跳过常规的stdin/stdout处理和PTY处理,让客户端处理编辑,同时跟踪历史记录,或者使用readline之类的外部库的功能,或者使用内部历史队列。

票数 1
EN

Stack Overflow用户

发布于 2012-08-21 13:03:30

不需要Pty。您需要为readline配置新的历史密钥,方法是将以下行添加到/etc/inputrc~/.inputrc文件中:

代码语言:javascript
复制
"\e[A":history-search-backward
"\e[B":history-search-forward

原因如下:

通常,终端程序(读: telnet客户端)在用户按上键或下箭头键时发送转义码。

逃逸代码是:

代码语言:javascript
复制
\33[A   - up arrow 
\33[B   - down arrow

因为您的程序打印:^[[A^[[A^[[A^[[A,所以它不对转义序列进行正则化。所以你需要把这些转义序列告诉readline

请参阅更多信息

票数 0
EN

Stack Overflow用户

发布于 2014-01-30 02:07:52

Readline提供了一个测试文件rlPtyTest.c,它通过PTY测试readline。您可以使用它作为实现套接字的模板。https://github.com/alexmac/alcextra/blob/master/readline-6.2/examples/rlptytest.c

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12026694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档