我正在尝试编写一个在后台运行的程序,该程序可以“键入”父进程,例如发出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
?谢谢!
答案 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过程)。