首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过stdin发送SIGINT

通过stdin发送SIGINT
EN

Stack Overflow用户
提问于 2016-11-22 20:13:07
回答 1查看 1.4K关注 0票数 1

我目前正在编写一个应用程序,允许用户通过telnet访问远程计算机的bash。应用程序是在远程计算机上运行的telnet服务器。我正在将telnet流的输出传输到bash进程中,生成如下所示:

代码语言:javascript
复制
char *execArgs[] = {"/bin/bash", "-i", 0};
execv(execArgs[0], execArgs);

在普通的shell中,我可以完成几乎所有你能做的事情:输入命令、背距等等。然而,我在用CTRL+C杀死任务时遇到了问题。当我从telnet端接收到一个CTRL+C序列时,它作为0xFF出现。FF使telnet进入IAC模式(允许它解释命令),F8告诉我的程序发送ETX (0x03):

代码语言:javascript
复制
char tmpchar = 3;
retval = write(outfd[1], &tmpchar, 1);
fflush(fstdin);

其中outfd是进入bash进程的流。但是,我不认为0x03被解释为SIGINT信号,或者至少它没有杀死当前正在运行的任务。为什么会这样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-22 20:19:21

由于您没有终端,所以不能期望任何终端功能。因此,如果您将一个^C发送到管道中,那么^C就会从管道中出来。您可以使用kill向进程发送SIGINT

但是使用终端与bash对话会好得多!外壳期望与终端交互,而不是管道。将man pty输入您的系统,开始学习如何正确地执行它。

来自pty(7)手册页:

伪终端(有时缩写为"pty")是一对提供双向通信信道的虚拟字符设备。通道的一端称为主程序,另一端称为从端。伪终端的从端提供了一个与经典终端完全相同的接口。希望连接到终端的进程,可以打开伪终端的从端,然后由打开主端的程序驱动。 在主端写入的任何内容都被提供给从端上的进程,就好像它是在终端上输入的一样。例如,将中断字符(通常为control)写入主设备将导致为连接到从设备的前景进程组生成中断信号(SIGINT)。相反,写入伪终端的从端的任何内容都可以被连接到主端的进程读取。伪终端由网络登录服务(ssh(1)、rlogin(1)、telnet(1))、终端仿真器、脚本(1)、屏幕(1)和expect(1)等应用程序使用。

这就是你想要的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40750790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档