我从/proc/<pid>/environ
读取数据并得到了奇怪的结果。这怎么可能?
open("/proc/24696/environ", O_RDONLY) = 10
read(10, "24694\nPPid:\t2606\nTracerPid:\t0\nUi"..., 4096) = 1470144576
open("/proc/25387/environ", O_RDONLY) = 10
read(10, "686\nPPid:\t1\nTracerPid:\t0\nUid:\t10"..., 4096) = 5905728
为什么read
返回的值大于count
(4096)?
但每次都不会发生这种情况。
Debian 7,3.2.0-4-amd64#1 SMP Debian 3.2.84-1 x86_64 GNU / Linux
更新
我不认为这是strace
错误 - 我也打印出glibc的read
函数的结果,结果相同。
更新2:
我创建了一个再现问题的测试应用https://gist.github.com/lstipakov/70c5b5e96112c7f1f6204d70b2c8280e
它枚举/proc
下的所有进程并从environ
文件中读取。问题在不到一分钟内重现:
// do read, which sometimes returns weird values on 3.2.0-4-amd64 #1 SMP Debian 3.2.84-1 x86_64 GNU/Linux
char tmp[4096];
auto val = read(fd, tmp, sizeof(tmp));
if (val > sizeof(tmp)) {
std::cout << path << " read " << val << std::endl;
}
几秒后CXXFLAGS =“ - std = c ++ 11”make proc&amp;&amp; sudo ./proc
:
/ proc / 24341 / environ read 812785856
可以通过循环编译openvpn来复制:
$ while true; do make clean; make; done