通过stdin发送SIGINT

时间:2016-11-22 20:13:08

标签: c linux bash

我目前正在编写一个允许用户通过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信号,或者至少它没有杀死当前正在运行的任务。为什么会这样?

1 个答案:

答案 0 :(得分:2)

由于您没有终端,因此您不能指望任何终端功能。因此,如果您向管道发送^C,则^C将从管道中出来。您可以使用kill向流程发送SIGINT

但是,使用终端与bash交谈会更好!贝壳期望与终端交互,而不是管道。将man pty打入您的系统,开始学习如何正确操作。

来自pty(7)手册页:

  

伪终端(有时缩写为“pty”)是一对提供双向通信信道的虚拟字符设备。通道的一端称为主通道;另一端被称为奴隶。          伪终端的从端提供了一个与传统终端完全相同的接口。一个          期望连接到终端的进程,可以打开伪终端的从端然后进行          由打开主端的程序驱动。

     

提供在主端写入的任何内容          从端的过程好像是在终端输入的。例如,写入中断          主设备的字符(通常是控制-C)将导致产生中断信号(SIGINT)          连接到从属的前台进程组。相反,任何写入奴隶的东西          可以通过连接到主端的进程读取伪终端的末尾。伪终端是          由网络登录服务(ssh(1),rlogin(1),telnet(1)),终端仿真器等应用程序使用          脚本(1),屏幕(1)和期望(1)。

这就是你想要的。