【发布时间】:2020-02-01 20:58:10
【问题描述】:
谁能帮我理解这两行在做什么
buf = (char *)(malloc(2 * pagesize) & pagemask);
buf = (char *)(((long)buf + pagesize) & ∼pagemask);
我了解 malloc,但不确定 & 操作在两个表达式中试图实现什么
Pagesize 和 pagemask 前面定义如下
pagesize = sysconf(_SC_PAGESIZE);
pagemask = pagesize - 1;
谢谢!
编辑1
这段代码来自 Steve D. Pate 的一本书“Unix FileSystems”
编辑2
这是完整的代码
#include <sys/unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include “sys/fs/vx_ioctl.h”
#define MB (1024 * 1024)
main(int argc, char argv[])
{
char *buf;
int i, fd, advisory;
long pagesize, pagemask;
if (argc != 2) {
exit(1);
}
if (strcmp(argv[1], “VX_SEQ”) == 0) {
advisory = VX_SEQ;
} else if (strcmp(argv[1], “VX_RANDOM”) == 0) {
advisory = VX_RANDOM;
} else if (strcmp(argv[1], “VX_DIRECT”) == 0) {
advisory = VX_DIRECT;
}
pagesize = sysconf(_SC_PAGESIZE);
pagemask = pagesize - 1;
buf = (char *)(malloc(2 * pagesize) & pagemask);
buf = (char *)(((long)buf + pagesize) & ∼pagemask);
fd = open(“myfile”, O_RDWR);
ioctl(fd, VX_SETCACHE, advisory);
for (i=0 ; i<MB ; i++) {
read(fd, buf, 4096);
}
}
【问题讨论】:
-
&是二进制和。 -
调用
malloc并立即对结果进行算术运算似乎是个坏主意。稍后您需要将原始指针传递给free。 -
选择一个随机数,你认为
malloc可能会返回。然后写在纸上。然后使用笔和纸执行第二个操作。对几个不同的数字执行此操作,您可能会开始看到一种模式。笔和纸仍然是程序员工具箱中两个非常重要的部分。