c - 正常虚拟程序后标准输入未刷新

标签 c stdin flush

这是我测试一些东西后写的一段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 并且 dummystdin 连接到 bash< 的 stdin/

从那时起,dummy 处理read 的五个字符,忽略其他字符(将它们留在stdin 缓冲区中)。当控件返回到 bash 时,它会一直等到 buffer 中至少有一个字符可供读取。瞧,stdin 缓冲区中有字符,因此程序 - 而不是等待,开始从 stdin 读取,因为 stdin 最后,包含\n 流程才真正执行。这将启动 /bin/sh。剩下的就交给/bin/sh来操心了!

关于c - 正常虚拟程序后标准输入未刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14897480/

相关文章:

c++ - boost::process 写入标准输入

python - python 中的文件到套接字适配器

c++ - 为什么从流中读取不需要刷新缓冲区

java - ServletResponse#flushBuffer() 包括什么?

c - 生成 C 声明

c - glTexImage2D,以随机和偶然的方式,在执行中花费了 800 倍以上

c - 在 C 中的结构中使用 "static"

c - 非常复杂的C无限循环调试

java - 如何在java中刷新dns

c - 所有点之间的最短路径问题,floyd warshall