Linux下如何获知进程终止时STDIN的已读取位置?
Linux下查询可执行程序读取输入文件的位置
如果你的程序已经运行结束,或者处于运行状态,可通过以下几种工具和方法确定它读取到输入文件的哪个位置:
一、程序运行中实时查看偏移量
1. 利用/proc文件系统
这是最直接的实时监控方式:
- 先获取程序的进程ID(PID):执行
ps aux | grep <你的程序名>,从输出里找到对应的PID - 查看进程打开的文件描述符:
ls -l /proc/<PID>/fd,找到对应输入文件的条目(如果程序通过标准输入读取,通常是0这个文件描述符) - 查看该文件描述符的详细信息:
cat /proc/<PID>/fdinfo/<fd编号>,输出中的pos字段就是当前已经读取到的字节位置。
2. 使用lsof命令
- 同样先拿到程序的PID,然后执行:
lsof -p <PID> -o | grep <输入文件名> - 输出结果里的
OFFSET列就是当前的读取偏移量(已读取的字节数)。
二、程序结束后回溯读取位置
如果程序已经退出,只能通过追踪系统调用的方式获取总读取量:
1. 用strace记录read调用
- 重新运行程序时,用
strace追踪所有read系统调用:strace -e read ./<你的程序名> < <输入文件名> 2>&1 - 查看输出里的每一条
read记录,其中返回值是本次读取的字节数,把所有返回值累加就是总读取的字节数。 - 也可以用统计模式快速得到总读取量:
strace -c -e read ./<你的程序名> < <输入文件名>,输出里的bytes列就是read调用的总字节数。
2. 间接验证剩余内容
拿到总读取字节数N后,你可以用tail查看输入文件中未被读取的部分,验证是否符合预期:
tail -c +$((N+1)) <输入文件名>
把这部分内容和后续测试用例的预期输出对比,就能确认程序是否读到了对应位置。
内容的提问来源于stack exchange,提问作者Jiashu Zou
相关产品推荐
相关产品推荐

