将一个字符戳入父进程的缓冲区

时间:2011-04-14 13:52:30

标签: c shell terminal automated-tests

我正在尝试编写一个在后台运行的程序,该程序可以“键入”父进程,例如发出shell命令就好像我自己在键盘上键入它们一样。我尝试使用ungetc()执行此操作以返回STDIN

#include <stdio.h>

int main (int argc, char** argv) {
        ungetc('x', stdin);
        return 0;
}

我希望这样做:

$ gcc -o unget unget.c
$ ./unget&

会让我$提示x,就像我刚输入它一样,但我什么都没得到。我是否因为进入后台而“迷失”STDIN?谢谢!

4 个答案:

答案 0 :(得分:4)

你想要做的事情根本无法奏效。 ungetc在stdio FILE缓冲区上运行,而不是基础打开文件描述,因此无法与其他进程共享。

您可以尝试在screen中运行交互式会话,并使用屏幕的exec命令将文件描述符重定向到将注入数据的进程。或者你可以使用伪tty设备自己实现这样的东西。

此外,根据您的评论,我认为您要做的是一个非常糟糕的主意。如果你运气不好而输入是在你以交互方式输入内容的过程中,那么可能会产生灾难性的后果。例如,成像自动化命令是

command_foo my_important_file

现在假设你正在打字

rm -rf useless_crap

<强>的Bam my_important_file刚被删除。

答案 1 :(得分:2)

这第二个答案并不是你所写的问题的答案,而是你试图解决的问题。它比向你的shell发送击键要强大得多。

在shell中,使用trap命令设置信号处理程序。例如:

trap "echo hello" USR2

USR2替换为您要使用的任何信号。然后运行一个子进程,定期将信号发送给它的父进程。

答案 2 :(得分:1)

否 - ungetc仅将字符“推”回程序拥有缓冲区,因此当同一程序读取的下一个字符将传递给{{1}时}。将某些内容传回父级需要完全不同的东西(例如,创建一些管道)。

答案 3 :(得分:0)

就在我的头顶,也许你可以调整你的终端的管道,以便你的孩子的cout是父母的cin。在bash中它会是这样的:

exec 6>&1
exec 7<&0
exec 1>&7
exec 0<&6

然后当你启动你的程序时,应该倒置管道。因此,你输入cout的所有东西都应该来自你父母的cin(在这种情况下是bash过程)。