- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试开发一个简单的“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/
我正在尝试开发一个简单的“telnet/server”守护进程,它必须在新的套接字连接上运行一个程序。这部分工作正常。 但是我必须将我的新进程关联到一个 pty,因为这个进程有一些终端功能(比如 re
import pty import os import sys import time pid, fd = os.forkpty() if pid == 0: # Slave os.e
我正在尝试为 shell 编写 pty I/O 透明过滤器。 以下示例大部分有效。大多数程序使用包装器按预期运行。这个例子没有做任何过滤,它的目的只是提供一个框架。 编辑:根据我在下面的回答,这个示例
我有一个在 Linux 中开发的 C++ 应用程序。我正在分配一些动态内存并最终调用 forkpty()。子进程正在调用 execl(),正如我们所知,如果成功执行命令,execl() 永远不会返回。
我希望对应用程序进行沙盒处理,以符合 Mac App Store 3 月 1 日的沙盒处理要求。我的应用程序包含一个内置终端仿真器,它利用 forkpty() 调用在伪 tty 环境中启动进程。不幸的
我正在尝试编写一个 python 脚本,它将通过 ssh 自动登录到远程主机并更新用户密码。由于 ssh 要求它从终端获取输入,因此我使用 os.forkpty(),在子进程中运行 ssh 并使用父进
我正在尝试使用forkpty来execvpless分页程序,然后从父进程中写入一些文本,这样子 less 进程将其作为其输入的方式。 我一直在研究如何实现这一点,但我无法使用 forkpty 来实现某
所以我在 Ubuntu 10.04 的 Eclipse 中开发我的项目。我有以下代码行: #include pid_t pid; int master; pid = forkpty(&master,
我有一个 GUI C++ 程序,它从用户那里获取一个 shell 命令,调用 forkpty() 和 execvp() 在子进程中执行该命令,而父 (GUI) 进程读取子进程的标准输出/stderr
我在服务器上安装了 Ubuntu 12.04。每个注册用户也被注册为 linux 用户,并通过/etc/security/limits.conf 被限制访问系统资源。 我尝试以注册用户之一的身份运行服
我正在尝试编写一个 python 脚本,它可以通过 ssh 连接到远程服务器,并可以从 python 客户端执行简单的命令,如 ls、cd。但是,在成功 ssh 进入服务器后,我无法读取伪终端的输出。
当我的程序到达这一行时: pid_t nPid = forkpty( &m_nMasterFD, NULL, NULL, NULL ); 输出这个: X Error: BadIDChoice (inv
我寻找一个实现了 forkpty() 的 GNU Common Lisp 包; openpty() 也将是一个很大的优势,而 login_tty() 将是我可以忍受的奢侈品。 (Duckduckgo、
我正在尝试使用forkpty来execvp一个ls/,然后从父进程读取它的输出并写入stdout . 我让它工作了,并且在 Valgrind 下运行它也没有显示任何错误。 编辑:Valgrind 没有
背景 我目前正在为用 Node.js (Javascript) 编写的文本编辑器编写终端模拟器。该应用程序使用 C++ 派生一个 shell 并在后端与其通信。 fork shell 的代码是由另一个
我有一个使用 forkpty 执行 bash shell 的 C 程序。我发现这个 shell 启动的程序是在忽略 SIGINT 的情况下启动的,所以当我向 shell 发送 Ctrl-C 时,它们永
我无法在 MacOS 10.12 上启动终端 我收到以下消息: [forkpty: Resource temporarily unavailable][Could not create a new p
我是一名优秀的程序员,十分优秀!