1

我用 mmap 尝试了以下配置:

  1. 打开文件(文件超过 2 kB)
  2. 从文件 *f_file* 请求统计信息
  3. 映射文件(文件小于一页,偏移页0,大小为预期大小)
  4. 验证地图 *f_fpage* 中 *f_footer* 的值
  5. 使用 strdup

代码:

union{
  ...
  struct {
    char    *f_fname;
    struct clog_footer *f_footer;
    char    *f_fpage;
    size_t  f_size;
  } f_ring;                   /* circular log file */
  char *f_fname;              /* Name use for Files|Pipes|TTYs.  */
} f_un;
...
struct clog_footer {
        uint32_t cf_magic;
};
...
1995            f->f_file = open(p+1, O_RDWR, 0 );
1996          if (f->f_file == -1) {
2000          }
2001          if (fstat(f->f_file,&sb)<0) {
2006          }
2014          f->f_un.f_ring.f_fpage = mmap(NULL,sb.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,f->f_file,0);
2015          if (f->f_un.f_ring.f_fpage == MAP_FAILED) {
2020          }
2021          f->f_un.f_ring.f_footer = (struct clog_footer*)(f->f_un.f_ring.f_fpage + sb.st_size-sizeof(struct clog_footer));
2022          if (memcmp(&(f->f_un.f_ring.f_footer->cf_magic),MAGIC_CONST,4)!=0) {
2029          }
2031          f->f_un.f_fname = strdup (p+1);
...

我使用读/写,文件填充为零,最大为 2 Kb。我使用文件大小和零页面大小对mmap进行了参数化,但mmap无法映射文件。

要映射的文件是否应该具有其他属性?

一旦我想从头开始映射文件,“0”是否是可接受的参数作为 mmap 中的偏移量?

4

0 回答 0