我在用C编写一个基本的反壳:
if(-1 == (myShell->pid = fork()))
{
PipeSet_close(&myShell->pipeSet);
return RS_ERROR;
}
if(myShell->pid == 0)
{
/* close pipe ends child doesn't need */
close(myShell->pipeSet.stdInPipe[1]);
close(myShell->pipeSet.stdOutPipe[0]);
close(myShell->pipeSet.stdErrPipe[0]);
/* dupe 2 the pipes we DO need frm their originals */
dup2(myShell->pipeSet.stdInPipe[0], fileno(stdin));
dup2(myShell->pipeSet.stdOutPipe[1],fileno(stdout));
dup2(myShell->pipeSet.stdErrPipe[1],fileno(stderr));
/* bash now replaces child process. only returns after bash terminates */
execl(getenv("SHELL"),NULL,NULL);
return RS_SUCCESS;
}
我可以用我的父进程从我的3个管道读写。这允许我通过子命令执行基本的shell命令。ls-l、ps、chmod+x等等。我遇到的问题是,当我使用shell运行一个需要用户输入的简单程序时。我使用以下程序对此进行测试:
int main()
{
int opt;
while (1==1)
{
printf("-----Remote Shell Menu test:------\n");
printf(" 1. print 1\n");
printf(" 2. print 2\n");
printf(" 3. exit\n");
fflush(stdin);
scanf("%d",&opt);
switch (opt)
{
case 1: printf("Pressed 1\n"); break;
case 2: printf("Pressed 2\n"); break;
case 3: return 0;
default: printf("unknown menu option %d\n",opt);
}
}
}
我可以像往常一样通过反向shell与这个子程序交互,然后按“1”“2”1“3”,但在整个菜单程序终止并按3之前,我不会通过stdout管道获取菜单或看到任何输出。有人能告诉我为什么吗?
如果一个从我的叉子里产生另一个猛击壳,情况就不是这样了。。。
最佳答案
你有什么都不做的。fflush仅用于输出流。我相信如果您将此更改为fflush(stdin)
,它将解决您的缓冲问题。