我目前正在编写一个允许用户通过telnet访问远程机器的bash shell的应用程序。该应用程序是在远程计算机上运行的telnet服务器。我正在将telnet流的输出传递给我生成的bash进程:
char *execArgs[] = {"/bin/bash", "-i", 0};
execv(execArgs[0], execArgs);
我几乎可以在普通的shell中做你能做的一切;键入命令,退格等。但是,我遇到了使用CTRL + C查杀任务的问题。当我从telnet端收到一个CTRL + C序列时,它以[0xFF] [0xF8]的形式出现。 FF将telnet置于IAC模式(允许它解释命令),F8告诉我的程序发送ETX(0x03):
char tmpchar = 3;
retval = write(outfd[1], &tmpchar, 1);
fflush(fstdin);
outfd是进入bash进程的流。但是,我不认为0x03
被解释为SIGINT信号,或者至少它没有杀死当前正在运行的任务。为什么会这样?
答案 0 :(得分:2)
由于您没有终端,因此您不能指望任何终端功能。因此,如果您向管道发送^C
,则^C
将从管道中出来。您可以使用kill
向流程发送SIGINT
。
但是,使用终端与bash
交谈会更好!贝壳期望与终端交互,而不是管道。将man pty
打入您的系统,开始学习如何正确操作。
来自pty(7)
手册页:
伪终端(有时缩写为“pty”)是一对提供双向通信信道的虚拟字符设备。通道的一端称为主通道;另一端被称为奴隶。 伪终端的从端提供了一个与传统终端完全相同的接口。一个 期望连接到终端的进程,可以打开伪终端的从端然后进行 由打开主端的程序驱动。
提供在主端写入的任何内容 从端的过程好像是在终端输入的。例如,写入中断 主设备的字符(通常是控制-C)将导致产生中断信号(SIGINT) 连接到从属的前台进程组。相反,任何写入奴隶的东西 可以通过连接到主端的进程读取伪终端的末尾。伪终端是 由网络登录服务(ssh(1),rlogin(1),telnet(1)),终端仿真器等应用程序使用 脚本(1),屏幕(1)和期望(1)。
这就是你想要的。