咨询ss工具配置Flex从命令行参数获取输入的位置
关于ss工具配置Flex读取命令行参数的说明
首先得明确:ss(来自iproute2套件)确实使用Bison+Flex处理命令行参数,但Flex默认从stdin读取输入,所以它是通过手动切换Flex的输入源来读取命令行参数的,而不是修改Flex的默认配置。
具体来说,在ss的源码实现里,核心步骤是这样的:
- 主程序(通常是
ss.c的main()函数)会收集所有命令行参数(除了程序名argv[0]),把它们拼接成一个连续的字符串(每个参数之间用空格分隔,模拟命令行的输入格式)。 - 调用Flex提供的
yy_scan_string()函数,把这个拼接好的字符串作为输入缓冲区传给Flex的词法分析器。 - Flex从这个字符串里读取字符生成Token,再传给Bison的语法分析器进行参数解析,全程不会读取标准输入。
如果你去看ss的lexer源码(ss.l),你会发现它并没有修改Flex的默认输入逻辑,而是在主程序层面完成了输入源的切换。有些类似实现里也会用yy_switch_to_buffer()配合yy_create_buffer()来构建从argv参数生成的输入缓冲区,效果是一致的。
这种方式是用Flex/Bison处理命令行参数的常规操作——因为命令行参数保存在argv数组里,并非标准输入流,所以必须手动把这些参数转换成Flex能处理的输入源。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

