私は Linux デーモンを作成しており、telnet 経由でそのパラメーターを構成する機能を実装したいと考えています。履歴とコンプリーターを備えた gnu readline ライブラリを使用して記述された cli インターフェイス コードがあり、そのインターフェイス コードをデーモンに使用したいと考えています。
stdin/stdout をソケットにリダイレクトし、rl_instream/rl_outstream をソケットにリダイレクトし、マスター/スレーブ pty に読み書きしようとしましたが、成功しませんでした。
同様の質問が回答なしでここで尋ねられました。
this questionも読んでください。ただし、子プロセスはありません。
私の質問は次のとおりです。
- 単一プロセス内で pty 機能を使用するにはどうすればよいですか?
- プロセスが 1 つしかない場合、マスターとスレーブの 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;
}
どうもありがとう。