forkpty – socket

我试图开发一个简单的“telnet / server”守护进程,它必须在新的套接字连接上运行一个程序。 这部分工作正常。

但是我必须把我的新进程和pty关联起来,因为这个进程有一些terminalfunction(比如readline)。

我开发的代码是(其中socketfd是新input连接的新套接字文件描述符):

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查看时),因此,此进程的terminalfunction不起作用。

在远程设备上通过ssh / sshd进行连接testing,并执行“localy”(在ssh连接下)prgName,显示此进程“prgName”的stdin / stdout / stderr fd与一个pty关联这个过程的terminal能力工作正常)。

我做错了什么? 如何将我的socketfd与pty(由forkpty创build)相关联?

谢谢

亚历克斯

您必须编写一些代码来将数据从套接字传输到主站点,反之亦然。 这通常是父母进程的工作。 请注意,数据传输必须是双向的。 有很多选项:一个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); } 

或一对线程,一个用于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); 

无论如何,你必须在分支的父节点添加一些代码。

问候

—编辑—当然,您不能将fd 0,1和2重定向到子进程中的socketfd。