Ale*_*xxx 5 c sockets linux pty
我正在尝试开发一个简单的“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);
}
}
Run Code Online (Sandbox Code Playgroud)
使用该代码,我的“prgName”的 stdin / stdout / stderr 文件描述符与套接字相关联(使用 ls -la /proc/PID/fd 查看时),因此,此进程的终端功能不起作用.
通过远程设备上的 ssh/sshd 连接进行测试,并执行“localy”(在 ssh 连接下)prgName,表明此进程“prgName”的 stdin/stdout/stderr fd 与 pty(等等)相关联此过程的终端功能运行良好)。
我做错了什么?如何将我的 socketfd 与 pty(由 forkpty 创建)相关联?
谢谢
亚历克斯
您必须编写一些代码来将数据从套接字传输到主 pty,反之亦然。这通常是父进程的工作。请注意,数据传输必须是双向的。有很多选项:一个 select() 驱动的循环来跟踪 masterfd 和 socketfd
(作为提示,非常糟糕的代码,不适用于生产!!!缺少错误和 eof 检查!!!)
for (;;) {
FD_ZERO(&set);
FD_SET(masterfd,&set);
FD_SET(socketfd,&set);
select(...,&set,...);
if (FD_ISSET(masterfd,&set)) {
read(masterfd,&c,1);
write(socketfd,&c,1);
}
if (FD_ISSET(sockerfd,&set)) {
read(sochetfd,&c,1);
write(masterfd,&c,1);
}
Run Code Online (Sandbox Code Playgroud)
或一对线程,一个用于 socketfd->masterfd,一个用于 masterfd->sockefd 传输。
(作为提示,非常糟糕的代码,不适用于生产!!!)
/*thread 1 */
while (read(masterfd,&c,1) > 0)
write(socketfd,&c,1);
/*thread 2 */
while (read(socketfd,&c,1) > 0)
write(masterfdfd,&c,1);
Run Code Online (Sandbox Code Playgroud)
无论如何,您必须在分支的父端添加一些代码。
问候
---EDIT--- 当然,您不能将 fd 0,1 和 2 重定向到子进程中的 socketfd。
| 归档时间: |
|
| 查看次数: |
4602 次 |
| 最近记录: |