为什么调用brk(0)?

为什么调用brk(0)?

tail在第一个 shell 上,我运行不带参数的命令。

在第二个 shell 上,我使用 strace 杀死第一个尾部以监视系统调用。

qdii@nomada ~ $ strace kill 1713
execve("/bin/kill", ["kill", "1713"], [/* 82 vars */]) = 0
brk(0)                                  = 0x2533000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f9dacfe8000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3

我不知道这个brk命令,所以我查了一下,发现它改变了进程数据段的结尾。为什么要kill这么做?特别是设置数据段似乎0没有什么意义。

答案1

运行时库调用sbrk读取数据段的当前末尾。 sbrk在系统调用之上实现brk;如您所见,brk使用无效地址调用只会返回当前值。

相关内容