新しいソケット接続でプログラムを実行する必要がある単純な「telnet/server」デーモンを開発しようとしています。この部分は正常に動作しています。
しかし、新しいプロセスを pty に関連付ける必要があります。これは、このプロセスにはいくつかの端末機能 (readline など) があるためです。
私が開発したコードは次のとおりです (socketfd は、新しい入力接続の新しいソケット ファイル記述子です)。
int masterfd, pid;
const char *prgName = "...";
char *arguments[10] = ....;
if ((pid = forkpty(&masterfd, NULL, NULL, NULL)) < 0)
perror("FORK");
else if (pid)
return pid;
else
{
close(STDOUT_FILENO);
dup2(socketfd, STDOUT_FILENO);
close(STDIN_FILENO);
dup2(socketfd, STDIN_FILENO);
close(STDERR_FILENO);
dup2(socketfd, STDERR_FILENO);
if (execvp(prgName, arguments) < 0)
{
perror("execvp");
exit(2);
}
}
そのコードでは、「prgName」の stdin / stdout / stderr ファイル記述子がソケットに関連付けられているため (ls -la /proc/PID/fd で検索した場合)、このプロセスの端末機能は機能しません。 .
リモート デバイスで ssh/sshd を介して接続し、「localy」(ssh 接続で) prgName を実行するテストでは、このプロセス「prgName」の stdin/stdout/stderr fd が pty に関連付けられていることが示されます (したがって、このプロセスの端末機能は正常に動作しています)。
私が間違っていることは何ですか?自分の socketfd を pty (forkpty で作成) に関連付けるには?
感謝
アレックス