我正在编写 linux 守护程序,我想实现通过 telnet 配置其参数的能力。我有一个 cli 接口代码,使用带有历史和完成程序的 gnu readline 库编写,我想将该接口代码用于守护进程。
我尝试将标准输入/标准输出重定向到套接字,将 rl_instream/rl_outstream 重定向到套接字,读/写到主/从 pty,但没有成功。
类似的问题在这里问没有任何答案。
还阅读了这个问题,但我没有子进程。
我的问题是:
- 如何在单个进程中使用 pty 功能?
- 如果我只有单个进程,是否需要使用 master 和 slave pty?
代码示例(在 pty 设备上没有操作),预期结果 - readline 正常工作
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;
}
非常感谢。