Я пишу демон linux и хочу реализовать возможность настройки его параметров через telnet. У меня есть код интерфейса cli, написанный с использованием библиотеки gnu readline с историей и дополнениями, и я хотел бы использовать этот код интерфейса для демона.
Я пытался перенаправить stdin/stdout на сокет, перенаправить rl_instream/rl_outstream на сокет, прочитать/записать на ведущий/подчиненный pty, но безуспешно.
похожий вопрос задан здесь без каких-либо ответы.
Также прочитайте этот вопрос, но у меня нет дочернего процесса.
Мои вопросы:
- Как я могу использовать функциональность pty внутри одного процесса?
- Нужно ли мне использовать главный и подчиненный 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;
}
Большое спасибо.