可以/ proc / self / exe是mmap'ed吗?

时间:2017-02-16 11:21:07

标签: c linux mmap procfs

进程可以使用mmap读取/ proc / self / exe吗?该程序无法对文件进行mmap:

$ cat e.c
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
int main()
{
  int f=open("/proc/self/exe",O_RDONLY);
  char*p=mmap(NULL,0,PROT_READ,0,f,0);
  return 0;
}

$ cc e.c -o e
$ strace ./e
[snip]
open("/proc/self/exe", O_RDONLY)        = 3
mmap(NULL, 0, PROT_READ, MAP_FILE, 3, 0) = -1 EINVAL (Invalid argument)
exit_group(0)                           = ?
+++ exited with 0 +++

1 个答案:

答案 0 :(得分:1)

你在这里犯了两个错误:

  • 映射的大小必须是&gt; 0.零大小的映射无效。
  • 如果要创建共享(MAP_SHARED)或私有(MAP_PRIVATE)映射,则必须指定。

以下应该起作用:

char *p = mmap(NULL, 4096, PROT_READ, MAP_SHARED, f, 0);

如果您希望映射完整的可执行文件,则必须首先对其执行stat(),以检索正确的文件大小,然后将其用作mmap()的第二个参数。