系统调用read()返回的数字大于count

时间:2017-02-01 08:29:59

标签: linux linux-kernel debian system-calls strace

我从/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

0 个答案:

没有答案