strdup 之后 mmap 中断

发布于 2024-12-21 21:46:32 字数 1355 浏览 4 评论 0原文

我尝试使用 mmap 进行以下配置:

  1. 打开文件(文件超过 2 kB)
  2. 从文件 *f_file*
  3. 映射文件请求统计信息(文件小于页面,偏移页 0,大小为预期大小)
  4. 验证 *f_footer* 的值地图 *f_fpage*
  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 中的偏移量是可接受的参数吗?

I tried the following configuration with mmap:

  1. open file (file is over 2 kB)
  2. request statistics from file *f_file*
  3. map file (file is smaller than a page, offset page 0, size is expected size)
  4. verify values of *f_footer* in the map *f_fpage*
  5. usage strdup

Code:

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);
...

I used read/write, file is filled with zero's up to 2 Kb. I parametrized mmap with file size and zero page size, but mmap fails to map the file.

Should the file to map have additional properties?

Is "0" a acceptable parameter as offset in mmap, once i want to map the file from beginning?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文