这是我测试一些东西后写的一段c代码。
我知道这不是一个漏洞问题,但我不明白为什么在程序正常返回后,在提示返回 stdin、stdout、stderr 时,stdin 没有被刷新。我的意思是为什么在程序正常执行结束后 stdin 上的剩余字符被重定向到 stdout 而不是刷新?
$cat dummy.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
int main(){
char rbuf[100];
if (read(0, rbuf,5) == -1){
perror("learn to count");
printf("errno = %d.\n", errno);
exit(1);
}
//printf("rbuf : %s\n",rbuf);
return 1;
}
这里执行:
$ gcc -o dummy dummy.c
$ ./dummy
AAAAA /bin/sh
$ /bin/sh
sh-3.2$ exit
exit
$
我猜这只是打印在 mew stdout 上的 stdin 的剩余字符串,它是提示符。加上末尾的换行符,它以某种方式模拟用户按下的回车键来执行命令。这是怎么回事?我只是想知道更多。
最佳答案
是的,你猜对了,这些是 stdin
中的额外字符:
这样做:
void flush_stdin()
{
while(getchar() != '\n');
}
注意:不要在 stdin
上使用 fflush()
,因为这是未定义的行为
编辑
stdin
连接到启动程序的终端(即 bash
)。这将启动一个新程序 dummy
并且 dummy
的 stdin
连接到 bash< 的
。 stdin
/
从那时起,dummy
处理read
的五个字符,忽略其他字符(将它们留在stdin
缓冲区中)。当控件返回到 bash
时,它会一直等到 buffer
中至少有一个字符可供读取。瞧,stdin
缓冲区中有字符,因此程序 - 而不是等待,开始从 stdin
读取,因为 stdin
最后,包含\n
流程才真正执行。这将启动 /bin/sh
。剩下的就交给/bin/sh
来操心了!
关于c - 正常虚拟程序后标准输入未刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14897480/