Rust程序从STDIN读取输入时,如何判断输入已结束?
管道输入时程序自动终止读取的原理
这既不是cat发送了SIGINT信号,也不是靠空字节这类哨兵标记,核心是**EOF(文件结束符)**的流状态机制,具体流程如下:
管道的工作逻辑
当你执行cat my_awesome_file | ./tiny_program时,cat会把文件内容全部输出到管道的写端,完成后cat会正常退出,同时关闭自己的标准输出(STDOUT)。此时管道的读端(你的程序的STDIN)会检测到输入流已经没有更多数据,触发EOF状态。Rust代码的处理逻辑
你的代码里std::io::stdin().lines()返回的是一个迭代器,它会持续尝试从STDIN读取行数据:
- 每次迭代调用
next()时,会读取一行直到换行符; - 当底层输入流触发EOF状态时,迭代器会返回
None,for循环因此自动终止,程序继续执行后续的打印链表操作。
常见误解澄清
- 不是SIGINT信号:SIGINT是强制中断信号(比如手动按Ctrl+C),
cat正常完成文件读取后会优雅退出,不会发送该信号。 - 不是空字节哨兵:空字节是普通的二进制数据,不会被当作输入结束的标记,EOF是流的状态,而非实际存在的字节。
附上你的测试代码:
use std::collections::LinkedList; fn main() { let mut ll: LinkedList<String> = LinkedList::new(); for line in std::io::stdin().lines() { ll.push_back(line.unwrap()); } println!("{:?}", ll); }
内容的提问来源于stack exchange,提问作者mobotsar
相关产品推荐
相关产品推荐

