forkpty - socket

时间:2010-03-23 13:46:02

标签: c linux sockets 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);
    }
}

使用该代码,我的“prgName”的stdin / stdout / stderr文件描述符与套接字相关联(当使用ls -la / proc / PID / fd查找时),因此,此进程的终端功能不会不行。

在远程设备上通过ssh / sshd连接并执行“localy”(在ssh连接下)prgName的测试,显示此进程“prgName”的stdin / stdout / stderr fd与pty相关联(因此,此过程的终端功能正常工作)。

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

感谢

亚历

1 个答案:

答案 0 :(得分:4)

您必须编写一些代码以将数据从套接字传输到master 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);
  }

或一对线程,一个用于socketfd-&gt; masterfd,另一个用于masterfd-&gt; 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);

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

此致

--- --- EDIT 当然,您不能在子进程中将fd 0,1和2重定向到socketfd。