c - forkpty - 套接字

标签 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 创建)相关联?

感谢

亚历克斯

最佳答案

您必须编写一些代码将数据从套接字传输到主 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->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。

关于c - forkpty - 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2500344/

相关文章:

c - 如何检查C中未初始化的指针

linux - awk 要求合并两个文件

node.js - Nodejs 最大套接字池设置

c - 使用 Glib 向 GSList 添加自定义结构

c - 确定谁在石头剪刀布中获胜的一行

linux - 在 bash 脚本 while 循环中,如何结束命令以继续循环?

linux - 通过搜索另一个文件从文件中删除匹配段落

ios - 如何在不破坏内置抽象的情况下将 websocket 请求路由到 SailsJS

php - 同一台PC上的stream_socket_server和stream_socket_client之间的长时间延迟

c++ - c/c++中return 0的作用是什么?