我试图读取文件并找出其中有多少行。 这些代码片段没有' if'错误处理。 ...
int fd = -1;
struct stat buff;
char * logbuff;
fd = open("/home/path/to/test", O_RDONLY, 0);
fstat(fd, &buff);
logbuff =
(char*)mmap(
NULL, //OS chooses address
buff.st_size, //Size of file
PROT_READ, //Read only
MAP_ANON|MAP_SHARED, //copy on write
fd,
0
);
const char * ch = &logbuff[0];
for ( i = 0; i < buff.st_size; i++ ) {
if ( ch[i] == '\n' ) {
newlines++;
cout << ch[i];
}
}
cout << "lines: " << newlines << endl;
我得到的行:0&#39;
我有一个
答案 0 :(得分:0)
让我们阅读MAP_ANON
和MAP_ANONYMOUS
的文档:
MAP_ANON
MAP_ANONYMOUS的同义词。弃用。
MAP_ANONYMOUS
任何文件都不支持映射;其内容初始化为零。 fd和offset参数被忽略;但是,有些实现需要 如果指定了
MAP_ANONYMOUS
(或MAP_ANON
),则fd为-1,以及可移植应用程序 应该确保这一点。将MAP_ANONYMOUS
与MAP_SHARED
结合使用是 自内核2.4以来仅在Linux上受支持。
因此,我们可以看到,当我们使用MAP_ANON
时,fd
参数被忽略!您实际上在寻找MAP_PRIVATE
:
MAP_PRIVATE
创建私有的写时复制映射。映射的更新对映射同一文件的其他进程不可见,并且不会传递到基础文件。未指定在
mmap()
调用之后对文件所做的更改是否在映射区域中可见。
因此,对mmap的调用应为:
logbuff = mmap(NULL, buff.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
此外,您还需要验证对mmap()
的调用是否成功。为此,请确保返回的指针不是MAP_FAILED
。