回声控制C字符

时间:2011-06-01 04:35:02

标签: bash

我需要grep第三方程序的输出。该程序转储数据但不终止而不按^ c终止它。

我正在搜索并使用其pid查杀它。但是,我想知道是否有可能回应控制C字符。伪代码看起来像

echo ^c | ./program_that_does_not_terminate

我可以在DOS中做这样的事情,所以在linux中一定有办法。

C:\>echo y | del C:\tmp\*
C:\tmp\*, Are you sure (Y/N)? y
C:\>

5 个答案:

答案 0 :(得分:24)

不会,将CTRL-C字符输入流程将无法正常工作,因为终端会捕获CTRL-C键并将其转换为发送给流程的终止信号。

CTRL-C的正确字符代码(ASCII格式)是代码3,但是,如果你将它回显给程序,它只会从标准输入中接收字符。它不会导致进程终止。

如果您想简化查找和终止该过程的任务,可以使用以下内容:

./program_that_does_not_terminate &
pid=$!
sleep 20
kill ${pid}

$!将为您提供上次启动的后台流程的进程ID。

答案 1 :(得分:14)

在Bash中,可以通过编写^Cecho作为参数传递给命令行(并因此传递给$'\cc'以进行回显)。因此,所需的命令是:

echo $'\cc' | ./program_that_does_not_terminate

答案 2 :(得分:2)

尝试以下方法:

expect -c "send \003;"

答案 3 :(得分:1)

我想,你需要一些更复杂的东西。如果要捕获程序的输出,则无法立即将kill信号发送到程序。与上面的示例相比,del命令等待输入,而 CTRL + C 不是直接输入,而是终止信号。

我建议一个解决方案,您可以确定是否捕获了所有输出,然后发送了kill信号。但是,所有输出只能由您决定的时间点。

答案 4 :(得分:0)

正如@paxdiablo所说,CTRL-C按键被终端捕获并转换为发送给进程的终止信号。因此,如果您的进程连接到终端,则可以将@jwodder提供的$'\ cc'发送到该终端,让终端向该进程发送实际的终止信号。

步骤:

1。编译Execute a command in another terminal via /dev/pts中的C文件

2。sudo ./a.out -n /dev/pts/0 $'\cc'  #将/ dev / pts / 0更改为您的进程所连接的tty